[App 개발] GNU Scientific Library 를 Xcode 에서 컴파일하다
본문
그런데, 커맨드 라인에서 컴파일한 libgsl.a 를 Xcode 에서 사용하게 되면 Debug 모드에서는 문제가 없으나, Release 로 컴파일하게 될 때에는 링크 에러가 나옵니다. 아마도 ZeroLink 일 때에는 발견되지 않았던 redefinition 문제인 듯 싶군요. 집에있는 G5 로 다시 확인해봐야겠습니다.
그리고 또 한가지, 인텔 맥에서 GSL 컴파일 문제입니다. 현재까지는 소스 그대로 컴파일은 안되고, ./configure 한 다음 config.h 에서 HAVE_DARWIN_IEEE_INTERFACE 선언문을 삭제해 주어야 컴파일이 가능합니다. (그렇지 않으면 PPC 용 파일을 컴파일 시도해서 에러가 발생...) 그러나 일단 컴파일이 되고 난 다음이라 할지라도 Xcode 에서는 오로지 Debug 에서만이 사용 가능했습니다.
그래서 제가 시도한 것이 Xcode 에서 GSL 을 컴파일하는 것입니다.
libgsl.framework 을 만들면 최고이겠지만, 이것은 나중에 해보기로 하고 ㅡㅡ; 일단은 libgsl.a 로 만족하기로 했습니다. 먼저 gsl 최신 버전을 다운로드 받습니다. 저는 이것을 /Developer 디렉토리 밑에 gsl 이라고 놓고 풀었습니다.
그리고 ./configure 를 해 줍니다. (그래야 config.h 를 얻을 수 있으므로...)
그리고 위에서 언급한 HAVE_DARWIN 을 없애주었습니다. (이 부분은 아직 확신이 안 갑니다. x86 용 sf 를 제대로 인클루드하게 해 주던지, 이 부분도 Universal Binary 에 맞게끔 해 주어야 할 것 같은데...)
그런 다음 gsl 디렉토리에 들어갑니다. (/Developer/gsl/gsl) 여기서 make 를 한 번 때려줍니다. (흩어져 있는 헤더파일들의 alias 를 gsl 디렉토리에 만들어주어야 하기때문)
이제 노가다 부분입니다. Xcode 를 열엇 Static Library 를 gsl 이라는 이름으로 만듭니다. 그리고는 /Developer/gsl 에 있는 소스를 몽땅 새 프로젝트에 붙입니다. ㅡㅡ;;; 이제부터는 쓸데없는 파일들을 잘라 내는 작업입니다. 예를 들어 test_*** 파일들은 라이브러리에 들어갈 필요가 없습니다. ***_source 파일들은 실제 소스에서 인클루드하는 서브 소스이므로 두 번 프로젝트에 붙일 필요가 없습니다. 그 외에도 상당히 많은 서브 소스들을 잘라줍니다. (좀 더 스마트한 방법이 없을까 고민중입니다. ㅡㅡ;)
제 경우는 30분을 투자하여 드디어 컴파일! ㅠㅠ
그런 다음 gsl 샘플 코드를 하나 만들어서 libgsl.a 를 링크하시고, User Header Search Path 에 /Developer/gsl 을 넣어줍니다. 컴파일 해보면 당근 에러가 납니다. 같은 함수가 두 번 선언되어 있다는 메세지가 나올 겁니다. 왜냐하면 표준 라이브러리에 선언되어 있는 함수 몇 가지가 gsl 에서도 중복되어 선언된 것이 있기 때문입니다. 그것도 잘라 주시고...
어쨌든 됩니다. ㅡㅡ;
중요한 점은, libgsl.a 라이브러리 파일을 정말 유니버설로 만들 수 있는 것인지, 아직도 제 스스로 답을 못 내리고 있습니다. 맥북에서 컴파일한 라이브러리 파일을 G5 에 가져가서 링크해 보면 금방 들통이 나겠죠? 한 번 해보려고 합니다. 만약 libgsl.a 가 유니버설인 것이 확실하고, GSL 샘플들이 문제없이 동작되는 것을 확인해서 좋은 결과를 얻는다면 이것을 libgsl.framework 으로 배포할 수도 있겠지요? ^^
제 경우는 Intel 용으로만 컴파일했을 때 샘플 프로그램을 Release 로 컴파일했을 때 에러가 났습니다만, libgsl.a 를 유니버설로 컴파일해서 샘플 프로그램을 Release 로 컴파일했을 때에는 문제없이 잘 동작되는 것을 확인했습니다.
혹시, 관심 있으시거나 비슷한 시도를 하고 계시는 분들과 정보 교환하고 싶습니다. 알려주세요. ^^
최신글이 없습니다.
최신글이 없습니다.
댓글목록 1
hongjuny님의 댓글
일단 맥북 프로에서 컴파일한 libgsl.a 유니버설 라이브러리는 G5 에서도 그대로 동작이 되었습니다. 이로서, 스태틱 라이브러리도 유니버설이라는 뜻이 되는군요. 그거참... 헐헐~