gcc 获取ld以在生成DLL时忽略未定义的引用

bmvo0sr5  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(169)

我试图让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

(我已经修改了somewhere-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
在没有-fpic的情况下编译lib,将所有目标文件存放在一个带有ar.a中,并静态链接到它,同时将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++等),并让将要使用它的程序链接到它们?

dced5bon

dced5bon1#

实际上,ld不是gcc的一部分,它是binutils的一部分。
尝试使用gcc链接,或者在C++的情况下使用g++而不是ld
同样,在Windows上,你不能用未解析的符号来构建共享库(.dll)或可执行文件(.exe)。“DLL地狱”的一部分是你必须确保所有的符号都能解析。
通常情况下,需要找到提供这些符号的库并添加所需的-l标志。
然而,像undefined reference to 'memcpy'这样的错误表明它没有在标准库中找到内容。所以,要么你使用的是MinGW没有附带的ld,要么有一个像-nostdlib这样的标志告诉编译器不要寻找标准库。

相关问题