我正在尝试让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'
忽略未定义的引用(至少来自ld
和libopengl32
,如果不是libgdi32
等)并让程序使用它链接到他们?
答案 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
这样的标志告诉编译器不要查找标准库。