让 ld 在创建 DLL 时忽略未定义的引用

问题描述 投票:0回答:1

我试图让

gcc
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
(使用
-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,将所有目标文件存储在带有
.a
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'

我怎样才能让

ld
忽略未定义的引用(至少来自
libopengl32
libgdi32
,如果不是
libstdc++
等)并让要使用它的程序链接到它们?

gcc linker mingw ld
1个回答
0
投票

实际上

ld
不属于gcc。它是 binutils 的一部分。

尝试与

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

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

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

-l
标志。

但是像

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

© www.soinside.com 2019 - 2024. All rights reserved.