7

当从一堆用标志编译的目标文件中组合一个共享库时,我试图让gcc's忽略未解析的引用。ld-fpic

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

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(with -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

但它仍然抱怨没有-lopengl32and -lgdi32

在没有 的情况下编译库-fpic,将所有目标文件存储在一个.awithar和静态链接中,同时让 exe 程序链接到它-lopengl32-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忽略未定义的引用(至少来自libopengl32libgdi32如果不是libstdc++等)并让将要使用它的程序链接到它们?

4

1 回答 1

0

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

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

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

通常,只需找到提供这些符号的库并添加所需的-l标志。

然而,像undefined reference to 'memcpy'这样的错误表明它没有在标准库中找到东西。所以要么你使用ld的是 MinGW 没有附带的,要么有一个像-nostdlibpresent 这样的标志告诉编译器不要寻找标准库。

于 2021-06-29T08:46:38.767 回答