2014-12-29 3 views
2

Я пытаюсь создать программу обработки изображений, написанный на C++, которая зависит от следующих библиотек с использованием MinGW + MSYS (с GCC4.8.1), который я скачал с www.mingw.org/ на 64-битном компьютере Windows 8Как связать libgomp статически при динамическом связывании других библиотек?

LibJPEG

BLAS and LAPACK

Armadillo

OpenMP

Я успешно свел все файлы исходного кода (с -fopenmp флагом, конечно), то я связан со следующим утверждением:

g++ -o ./build/rspfitter {a list of .o files} -L{paths to libraries} -ljpeg -lopenblas -lgomp -lpthread

Исполняемыми правильно произведен. Тем не менее, он просит следующие библиотеки DLL:

libgomp-1.dll

libpthread-2.dll

pthreadGC2.dll

Я думаю, что это, возможно, лучшая идея связать libgomp и libpthread статический, так что я могу свести к минимуму числа библиотек DLL, мне нужно, чтобы развернуть свою программу (выше три dll не являются единственными, от которых зависит программа). Поэтому я попытался связать только libgomp и libpthread статический с помощью следующей команды:

g++ -o ./build/rspfitter {a list of .o files} -L{paths to libraries} -ljpeg -lopenblas -Wl,-static -lgomp -lpthread

Но на этот раз он терпит неудачу со следующим сообщением об ошибке:

d:/mingw/bin/../lib/gcc/mingw32/4.8.1\libgomp.a(env.o):(.text.startup+0xbfe): undefined reference to `_imp__pthread_attr_init'

d:/mingw/bin/../lib/gcc/mingw32/4.8.1\libgomp.a(env.o):(.text.startup+0xc13): undefined reference to `_imp__pthread_attr_setdetachstate'

d:/mingw/bin/../lib/gcc/mingw32/4.8.1\libgomp.a(env.o):(.text.startup+0x3c): undefined reference to `_imp__pthread_attr_setstacksize'

d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:

d:/mingw/bin/../lib/gcc/mingw32/4.8.1\libgomp.a(env.o): bad reloc address 0x0 in section `.ctors'

d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:

final link failed: Invalid operation

Затем я попытался выполнить ту же самую компиляцию и связывая команды с использованием среды MinGW + GCC 4.8.1, которая была установлена ​​вместе с CodeLite. Он снова терпит неудачу с различными сообщениями об ошибках:

./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text.unlikely+0x105): undefined reference to `_Unwind_Resume'

./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text$_ZN9NormalMapD1Ev[__ZN9NormalMapD1Ev]+0xb4): undefined reference to `_Unwind_Resume'

d:/mingw-4.8.1/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:

./tmp/hshfitcmdline.o: bad reloc address 0xb4 in section `.text$_ZN9NormalMapD1Ev[__ZN9NormalMapD1Ev]'

d:/mingw-4.8.1/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:

final link failed: Invalid operation collect2.exe: error: ld returned

1 exit status make: *** [build/rspfitter] Error 1

Я подтвердил, что файл «libgomp.a»/«libgomp.dll.a» присутствовал на [MinGW] реж /lib/gcc/mingw32/4.8. 1/для обеих установок MinGW. Однако они имеют разные размеры! При установке, загруженной с MinGW.org, «libgomp.a» имеет значение 86kb, а «libgomp.dll.a» - 87kb; Однако в установке CodeLite размер составляет 74kB и 148Kb соответственно.

Теперь я задаюсь:

  1. Что может быть причиной сообщения об ошибках, предоставляемом этих двух систем MinGW? Может ли быть, что статические библиотеки, которые я загрузил из MinGW, были сопоставлены? Но динамическая связь была отлично в обеих системах.

  2. Как я могу правильно связать libgomp статически?

Благодаря

+0

https://stackoverflow.com/questions/23869981/linking-openmp-static-with-gcc –

ответ

2

Чтобы связать libgomp статически вы можете сделать

ln -s `g++ --print-file-name=libgomp.a` && \ 
g++ foo.o -static-libgcc -static-libstdc++ -L. -o foo -fopenmp -ljpeg -lopenblas 

Однако ваш исполняемый файл будет по-прежнему зависеть от DLL PTHREAD. Причина, по которой вы получаете ошибку, заключается в том, что libc по-прежнему связывается динамически. Чтобы исправить это, вы должны связать libc статически, а

ln -s `g++ --print-file-name=libpthread.a` && \ 
ln -s `g++ --print-file-name=libc.a` && \ 
g++ foo.o -static-libgcc -static-libstdc++ -L. -o foo -fopenmp -ljpeg -lopenblas 

Однако, если openblas или jpeg библиотеки зависят от libc то, скорее всего, все равно будет неопределенные ссылки.

+0

Большое спасибо.Проблема решена. Извините за задержку принятия. –

+0

@MingjingZhang, это сработало! Это хорошо знать. Я отказался от статической привязки к Linux, но все равно кажется, что это нормально в Windows. –

+0

@Boson, извините, мне нужно обновить свой ответ. Я заметил, что размер исполняемого файла увеличивается с 1,19 МБ до 1,4 МБ, и он работает без DLL в той же папке, поэтому я думал, что это сработало. Только после этого я понял, что в какой-то момент я добавил путь к dlls как переменную среды, и exec фактически вызвал DLL там. Если я удалю переменную, она по-прежнему сообщает о недостающей ошибке dll. Увеличенный размер может быть вызван -static-libstdC++. Во всяком случае, мой руководитель подумал, что это нормально выпускать с dll; Думаю, я могу пропустить эту проблему на данный момент. Спасибо за помощь! –

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