2014-12-29 1 views
2

Windows 8 64 비트 컴퓨터에서 www.mingw.org/에서 다운로드 한 MinGW + MSYS (GCC4.8.1 포함)를 사용하는 다음 라이브러리에 따라 달라지는 C++로 작성된 이미지 처리 프로그램을 빌드하려고합니다.다른 라이브러리를 동적으로 링크 할 때 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을 요청 : 나는 (위의 세 가지로 내 프로그램을 배포하는 데 필요한 DLL을의 수를 최소화 할 수 있도록

libgomp-1.dll

libpthread-2.dll

pthreadGC2.dll

내가 정적이 더 나은 아이디어가 libgomp 연결할 수있는 생각에서 libpthread dll은 프로그램이 의존하는 유일한 파일은 아닙니다.)

다음

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

나는 똑같은 컴파일을 실행하기 위해 노력하고 :

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

그러나 다음과 같은 오류 메시지와 함께 실패이 시간 : 그래서 난 단지 libgomp을 연결하고 다음 명령을 사용하여 정적 libpthread가 시도 CodeLite와 함께 설치된 MinGW + GCC 4.8.1 환경을 사용하는 명령 연결. 이것은 다른 오류 메시지와 함께 다시 실패 :

./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-statically-with-gcc –

답변

2

은 실행 파일이 여전히 pthread와의 DLL에 따라 달라집니다 그러나 당신이

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

을 할 수있는 정적 libgomp 연결합니다. 오류가 발생하는 이유는 libc이 여전히 동적으로 연결되어 있기 때문입니다. 이 문제를 해결하려면 openblas 또는 jpeg 라이브러리 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 

그러나, 다음 가능성이 아직 정의되지 않은 참조가있을 것입니다 정적뿐만 아니라 libc를 연결해야합니다.

+0

고맙습니다.문제가 해결되었습니다. 지연된 인수에 대해 유감입니다. –

+0

@MingjingZhang, 효과가있었습니다! 그거 알아두면 좋을거야. 나는 리눅스에서 정적 링크를 포기했지만 여전히 Windows에서는 괜찮은 것처럼 보인다. –

+0

@Boson, 죄송합니다. 내 답변을 업데이트해야합니다. 내가 관찰 한 것은 실행 파일의 크기가 1.19MB에서 1.4MB로 증가한 것이고, 같은 폴더에 DLL없이 실행 되었기 때문에 효과가 있다고 생각했습니다. 지금까지는 dll에 경로를 환경 변수로 추가 한 점과 exec가 실제로 dll을 호출 한 것을 알게되었습니다. 변수를 제거하면 여전히 누락 된 dll 오류가보고됩니다. 증가 된 크기는 -static-libstdC++ 때문일 수 있습니다. 어쨌든, 내 상사가 dll로 릴리스하는 것이 좋다고 생각했다. 이제이 prob를 건너 뛸 수 있다고 생각해. 도와 줘서 고마워! –