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

Edw*_*d A 5 linker gcc mingw ld

我想获得gccld来自编译一堆对象文件放在一起时共享库忽略未解决的参考-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
Run Code Online (Sandbox Code Playgroud)

(我的某处是红色的,-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
Run Code Online (Sandbox Code Playgroud)

但它仍然抱怨没有-lopengl32-lgdi32.

编译lib没有-fpic,将所有目标文件存储在.awith ar和静态链接中,同时具有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'
Run Code Online (Sandbox Code Playgroud)

我怎样才能ld忽略未定义的引用(至少从libopengl32,libgdi32如果不是libstdc++等),让那些将要使用它的程序链接到它们?

Bre*_*ers 0

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

尝试用 链接gcc,或者在 C++ 的情况下用g++代替ld

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

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

然而,类似的错误undefined reference to 'memcpy'表明它没有在标准库中找到东西。因此,要么您使用的ld是 MinGW 中未提供的库,要么有一个类似-nostdlibpresent 的标志告诉编译器不要查找标准库。