2016-08-29 3 views
2

Я использую MinGW32 более конкретно TDM-GCC-32. Я очень простой проект, я связываюсь с одной пользовательской библиотеки, но эта ошибка выскакивает:«множественное определение` atexit »при связывании с DLL

>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 

Я предполагаю, что я должен использовать различные варианты для составления библиотеки, чтобы избежать переопределения.

+0

Я попробовал их, и это не решает мою проблему ... – lll

+0

Вы должны улучшить свой вопрос, показывая альтернативы, которые вы пробовали. –

+0

Попробуйте без '-D_WIN32 -D_MINGW', я ожидаю, что любые такие макросы будут встроены в сборку компилятора. –

ответ

1

Метод dlltool Я считаю, что в настоящее время устарел. Однако я не могу вас побеспокоить, поскольку большая часть доступной документации все еще говорит, чтобы сделать это таким образом.

Gcc свяжет непосредственно против .dll файлов, что делает .a файлы устарели (по крайней мере, для работы с DLL файлы - единственная причина, текущий, чтобы использовать .a файл для статической привязки). Вы даже не должны указать DLL с -l флагом, хотя вы должны указать путь к 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 

Если по каким-либо причинам вам действительно нужно создать .a файл из .dll, команда, которая работала для меня это ...

gendef interception.dll 
dlltool -l interception.a -d interception.def -k -A 

в хранилище вы связаны не предусматривает .dll файлы в своих релизах, вы не должны строить их самостоятельно

+0

Помню, я решил это сам, да, что-то не так с командой IIRC. Спасибо, в любом случае! :) – lll

Смежные вопросы