Отсутствуют экспортированные символы при построении с использованием MinGW, связанного с библиотекой stati c - PullRequest
0 голосов
/ 06 мая 2020

У меня есть простая программа на C ++ с зависимостью libcurl:

#include <curl/curl.h>

extern "C" int curlTest(void);

int curlTest(void) {
    CURL *curl = curl_easy_init();
    return 0;
}

Я хотел бы создать ее как общую библиотеку DLL, используя MinGW на Windows. Если скомпилирован и связан с Dynami c libcurl, все идет хорошо:

> g++ curlTest.cpp -c -o curlTestDynamic.o
> g++ curlTestDynamic.o -shared -o libCurlTestDynamic.dll -lcurl -lgdi32 -lws2_32

И если я перечисляю экспортированные символы libCurlTestDynamic.dll с dumpbin, только curlTest отображается в выводе, как и ожидалось:

> dumpbin /exports libCurlTestDynamic.dll

    ...

    ordinal hint RVA      name

          1    0 00001450 curlTest

    ...

Но если построено с stati c libcurl, этот curlTest символ просто отсутствует:

> g++ -DCURL_STATICLIB curlTest.cpp -c -o curlTestStatic.o
> g++ curlTestStatic.o -shared -o libCurlTestStatic.dll C:/path_to/libcurl.a -lgdi32 -lws2_32
> dumpbin /exports libCurlTestStatic.dll

    ...
    ordinal hint RVA      name

          1    0 000018A0 curl_easy_cleanup
          2    1 000018F0 curl_easy_duphandle
          ...
          (Lots of symbols like curl_* but no curlTest displayed)

    ...

1 Ответ

0 голосов
/ 06 мая 2020

Я думаю, вы должны украсить свой собственный экспорт, используя __declspec(dllexport). Я не уверен, почему это работает в одном случае, а не в другом, но добавление украшения должно быть надежным.

Также обратите внимание на импорт в libCurlTestStati c .dll. В зависимости от того, насколько хорошо собран libcurl.a, он может принести нежелательный импорт.

...