当使用与静态库链接的MinGW构建时,缺少导出的符号。

问题描述 投票:0回答:1

我有一个简单的c++程序,它依赖于libcurl。

#include <curl/curl.h>

extern "C" int curlTest(void);

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

我想在Windows上用MinGW把它编译成一个共享DLL库。如果编译并与 动态 libcurl,一切顺利。

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

如果我列出导出的符号 libCurlTestDynamic.dlldumpbin,只有 curlTest 是显示在输出中的,正如预期的那样。

> dumpbin /exports libCurlTestDynamic.dll

    ...

    ordinal hint RVA      name

          1    0 00001450 curlTest

    ...

但如果用 静态 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)

    ...
c++ windows mingw static-linking dynamic-linking
1个回答
0
投票

我想你应该用以下方法来装饰你自己的导出文件 __declspec(dllexport). 我不知道为什么一种情况下能用,另一种情况下不能用,但加装饰应该是万无一失的。

另外看看libCurlTestStatic.dll中的导入。 根据libcurl.a的构建情况,可能会带来一些不必要的导入。

© www.soinside.com 2019 - 2024. All rights reserved.