회사에서 쓰던 pthread 를 집에서 동일하게 사용하기 위해 소스를 컴파일 하는 순간, pthread 를 찾을 수 없다는 컴파일러 오류 메시지를 보게 되는 경우가 생겼습니다.

차이를 비교 해 보니, PC에 설치된 컴파일러 버젼이 차이가 있었습니다.

(단, 이 방법은 말 그대로 Windows 에서 minGW 를 빌드 할때만 적용 됩니다.)


회사 : minGW 4.4.1

집 : minGW 4.7.1 (TDM64-1)


과거를 되돌아 보니, 이전에 집에 설치한 minGW 4.5 버젼대는 FLTK 를 빌드할때 symbol 을 찾을 수 없다는 오류가 발생 하여 빌드를 할 수 없었던 것이 떠올랐습니다. 그래서 TDM package 로 내려받은 2013년2월11일 기준 최신 버젼을 유지해 본 것인데, 4.7 버젼 부터는 pthread 를 포함하고 있지 않고 있었습니다.


TDM-GCC 의 Pthread 관련 글 :
(http://sourceforge.net/projects/tdm-gcc/files/TDM-GCC%204.7%20series/4.7.1-tdm-1%20SJLJ/)


LibGOMP, GCC's implementation of OpenMP, currently only supports the use of the POSIX Threads (pthreads) api for implementing its threading model. Because the MinGW project itself doesn't distribute a pthreads implementation, the "pthreads-win32" library, available from http://sourceware.org/pthreads-win32/, is included in this distribution. If you aren't familiar with pthreads-win32, please read the file "pthreads-win32-README" for more information, or the documentation available at the website referenced above. pthreads-win32 is distributed under the terms of the LGPL; see "COPYING.lib-gcc-tdm.txt" for details.


이떄 필요한 것은 pthread 를 직접 찾아 빌드 하는 것.

다음 링크 위치에서 pthread 의 마지막 버젼 소스를 받습니다. (릴리즈 버젼)

ftp://sourceware.org/pub/pthreads-win32


이 위치에서 받은 소를 빌드 하기 위해서는 minGW만 필요 한 것이 아니라, 일반 windows PC 에서 sh 쉘을 에뮬레이션 해 주어서 make 를 할 수 있는 MSYS 가 필요 합니다.

다운로드 위치 : http://sourceforge.net/projects/mingw/files/


MSYS  와 minGW 의 설치가 완료되어 pthread 를 빌드 할 수 있게 되었다면, 간단히 pthread2 디렉터리로 간 다음 make 를 수행 해야 합니다만, 일반적으로 phtread2 소스는 단순히 make 를 할 수 없고, target 을 정해 주어야 합니다.

Run one of the following command lines:

make clean GC            (to build the GNU C dll with C cleanup code)

make clean GCE           (to build the GNU C dll with C++ exception handling)

make clean GC-inlined    (to build the GNU C inlined dll with C cleanup code)

make clean GCE-inlined   (to build the GNU C inlined dll with C++ exception hand

ling)

make clean GC-static     (to build the GNU C inlined static lib with C cleanup c

ode)

make clean GC-debug      (to build the GNU C debug dll with C cleanup code)

make clean GCE-debug     (to build the GNU C debug dll with C++ exception handling)

make clean GC-inlined-debug    (to build the GNU C inlined debug dll with C cleanup code)

make clean GCE-inlined-debug   (to build the GNU C inlined debug dll with C++ exception handling)

make clean GC-static-debug     (to build the GNU C inlined static debug lib with C cleanup code)


일반적으로 pthread를 직접 디버깅 할 것이 아니라면, 기존 minGW 에 포함되어 있던 GCE 나 GCE-inlined 를 target 으로 빌드 하는 것이 좋을듯 합니다.


만약, pthread 를 DLL 없이 사용하고자 한다면, static build 인 GC-static 을 사용하여도 됩니다.

단, 이 모든 build target 의 결과물은 minGW 컴파일러 위치에 복사가 되거나, 자신의 소스 위치에 참조가 되도록 해야 합니다.


그래서 기존의 -lphread 옵션으로 빌드가 가능하던 소스는 집접 빌드된 libpthreadGCE2.a 와 같은 object를 지시 하도록 해야 합니다.




Posted by 견족자K rageworx