"multiple definition of `atexit'" 与 DLL 链接时
"multiple definition of `atexit'" when linking with DLL
我更具体地使用 MinGW32 TDM-GCC-32。我有一个非常简单的项目 link 到一个自定义库,但弹出此错误:
>g++ -D_WIN32 -D_MINGW -lgdi32 -lgdiplus -Linterception/x86 -linterception main.cpp -o interceptor.exe
interception/x86/libinterception.a(dgnes00125.o):(.text+0x0): multiple definitio
n of `atexit'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o:crt1.c:(.text+0x2c0):
first defined here
interception/x86/libinterception.a(dgnes00109.o):(.text+0x0): multiple definitio
n of `_onexit'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o:crt1.c:(.text+0x2d0):
first defined here
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: C:/TD
M-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o: bad reloc address 0x20 in
section `.eh_frame'
collect2.exe: error: ld returned 1 exit status
我用来构建库的命令:
gcc -DINTERCEPTION_EXPORT -D_WIN32 -D_MINGW -shared -o interception.dll interception.c
dlltool -z interception.def --export-all-symbol interception.dll
dlltool -d interception.def -l libinterception.a
我想我必须使用不同的选项来编译库以避免重新定义..
我认为 dlltool
方法目前已被弃用。不过,我不能在这里责怪你,因为大多数可用的文档仍然说要这样做。
Gcc 将 link 直接针对 .dll
文件,使 .a
文件过时(至少在处理 dll 时是这样——这是目前使用 .a
文件的唯一原因用于静态 linking)。您甚至不必使用 -l
标志指定 dll,但如果 dll 不在当前目录中,则必须指定它的路径
C:\Users\burito>gcc main.o opengl32.dll -o main.exe
gcc: error: opengl32.dll: No such file or directory
C:\Users\burito>gcc main.o c:\Windows\system32\opengl32.dll -o main.exe
C:\Users\burito>
好的,opengl32.dll
可能不是一个很好的例子,但我希望我已经给了你大概的想法。
我相信 MSVC 仍然需要它的 .lib
文件来使用 .dll
,如果库没有,有几种方法可以制作它们'不带一个。
在您的特定情况下,应该起作用的命令是...
g++ -D_WIN32 -D_MINGW -lgdi32 -lgdiplus interception/x86/interception.dll main.cpp -o interceptor.exe
如果出于某种原因您确实需要从 .dll
创建一个 .a
文件,对我有用的命令是...
gendef interception.dll
dlltool -l interception.a -d interception.def -k -A
由于您 linked 的存储库在其版本中确实提供了 .dll
文件,因此您不必自己构建它们
我更具体地使用 MinGW32 TDM-GCC-32。我有一个非常简单的项目 link 到一个自定义库,但弹出此错误:
>g++ -D_WIN32 -D_MINGW -lgdi32 -lgdiplus -Linterception/x86 -linterception main.cpp -o interceptor.exe
interception/x86/libinterception.a(dgnes00125.o):(.text+0x0): multiple definitio
n of `atexit'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o:crt1.c:(.text+0x2c0):
first defined here
interception/x86/libinterception.a(dgnes00109.o):(.text+0x0): multiple definitio
n of `_onexit'
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o:crt1.c:(.text+0x2d0):
first defined here
C:/TDM-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: C:/TD
M-GCC-32/bin/../lib/gcc/mingw32/5.1.0/../../../crt2.o: bad reloc address 0x20 in
section `.eh_frame'
collect2.exe: error: ld returned 1 exit status
我用来构建库的命令:
gcc -DINTERCEPTION_EXPORT -D_WIN32 -D_MINGW -shared -o interception.dll interception.c
dlltool -z interception.def --export-all-symbol interception.dll
dlltool -d interception.def -l libinterception.a
我想我必须使用不同的选项来编译库以避免重新定义..
我认为 dlltool
方法目前已被弃用。不过,我不能在这里责怪你,因为大多数可用的文档仍然说要这样做。
Gcc 将 link 直接针对 .dll
文件,使 .a
文件过时(至少在处理 dll 时是这样——这是目前使用 .a
文件的唯一原因用于静态 linking)。您甚至不必使用 -l
标志指定 dll,但如果 dll 不在当前目录中,则必须指定它的路径
C:\Users\burito>gcc main.o opengl32.dll -o main.exe
gcc: error: opengl32.dll: No such file or directory
C:\Users\burito>gcc main.o c:\Windows\system32\opengl32.dll -o main.exe
C:\Users\burito>
好的,opengl32.dll
可能不是一个很好的例子,但我希望我已经给了你大概的想法。
我相信 MSVC 仍然需要它的 .lib
文件来使用 .dll
,如果库没有,有几种方法可以制作它们'不带一个。
在您的特定情况下,应该起作用的命令是...
g++ -D_WIN32 -D_MINGW -lgdi32 -lgdiplus interception/x86/interception.dll main.cpp -o interceptor.exe
如果出于某种原因您确实需要从 .dll
创建一个 .a
文件,对我有用的命令是...
gendef interception.dll
dlltool -l interception.a -d interception.def -k -A
由于您 linked 的存储库在其版本中确实提供了 .dll
文件,因此您不必自己构建它们