在创建共享库时让ld忽略未定义的引用

时间:2013-07-03 20:32:30

标签: gcc linker mingw ld

我正在尝试让gcc的{​​{1}}在使用ld标志编译的一堆目标文件中汇总共享库时忽略未解析的引用。

到目前为止,我尝试了很多选项(为了简洁起见,用一些小文件代替了许多目标文件的长文件名):

-fpic

(我的红色somewhere ld --allow-shlib-undefined --unresolved-symbols=ignore-all -shared 1.o 2.o -o lib0.so ld -G 1.o 2.o -o lib0.so 将允许未解析的引用,但没有运气。)

通过-G(使用gcc)运行它会导致较少的未解析引用,因为它默认链接

-Wl,--unresolved-symbols=ignore-all

但它仍然抱怨没有-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lopengl32

在没有-lgdi32的情况下编译lib,将-fpic中的所有目标文件与.a一起存储,并在将exe程序链接到ar-lopengl32时静态链接到它{1}}导致工作完全正常。

实际的错误消息(为简洁起见,替换了长文件和函数名称):

-lgdi32

如何让[file].o: In function `[function]': [file].cpp:19: undefined reference to `memcpy' [file].o: In function `[function]': [file].cpp:26: undefined reference to `memcpy' [file].o:[file].cpp:(.xdata+0x4c): undefined reference to `__gxx_personality_seh0' [file].o:[file].cpp:(.xdata+0x74): undefined reference to `__gxx_personality_seh0' [file].o:[file].cpp:(.rdata$[file]]+0x20):undefined reference to `__cxa_pure_virtual' [file].o:[file].cpp:(.rdata$[file]]+0x28): undefined reference to `__cxa_pure_virtual' 忽略未定义的引用(至少来自ldlibopengl32,如果不是libgdi32等)并让程序使用它链接到他们?

2 个答案:

答案 0 :(得分:0)

  

如何让ld忽略未定义的引用

GNU ld(和大多数其他UNIX链接器)已经在构建共享库时忽略未定义的引用。

看起来您可能在AIX上,共享库和可执行文件非常相似,并且适用特殊规则。 g++ -shared ...即使在AIX上也应该可以正常工作。

答案 1 :(得分:0)

实际上 + 不是 gcc 的一部分。它是 binutils 的一部分。

尝试使用 ld 链接,或者在 C++ 的情况下使用 gcc 而不是 g++

此外,在 Windows 上,您无法使用未解析的符号构建共享库 (.dll) 或可执行文件 (.exe)。 “DLL 地狱”的一部分是您必须确保所有符号都能解析。

通常需要找到提供这些符号的库并添加所需的 ld 标志。

然而,像 -l 这样的错误表明它没有在标准库中找到东西。因此,要么您使用的是 MinGW 未附带的 undefined reference to 'memcpy',要么存在像 ld 这样的标志告诉编译器不要查找标准库。