회사에서 쓰던 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를 지시 하도록 해야 합니다.