2014-11-08 3 views
5

최신 Xcode cmd line 도구를 사용하여 OSX 10.10에서 일부 코드를 컴파일하려고합니다. 컴파일은 작동하지만 링크는 악몽입니다. 첫째, 심볼이 다중 정의되는 오류가 발생합니다. 이 오류는 정확하지만 정의는 동일하며 제어하지 않는 타사 라이브러리에서도 마찬가지입니다. 나는이 문제를 링커가 무시하도록하는 방법을 알 수 없다. 한 가지 중요한 사실은 동일한 코드가 clang과 gcc 모두 내 우분투 상자에서 완벽하게 컴파일, 링크 및 실행된다는 것입니다. 이 링커 문제는 OS X에서만 발생합니다. 라이브러리는 정적입니다.OS X 10.10과의 링크 문제

내가 만나는 두 번째 문제는 낯선 사람입니다. 프로그램을 컴파일하고 연결할 수 있도록 필요한 (일부) 기능을 제거하면 "dyld : Symbol not found : __ZNSt12future_errorD1Ev"라는 재미있는 메시지가 나타납니다. 도대체 어떻게 그걸 고칠 수 있니? 구글은 그 전선에 도움이되지 못했다.

답변

3

좋아요, 그래서이 문제를 최선의 방법으로 해결했습니다. 여기 내가 배운 것이 있습니다. 첫째, 정적 링크 문제는 Apple의 "특별"버전 인 Clang을 사용하여 OSX에서 해결할 수없는 것처럼 보입니다. 라이브러리의 소스 코드를 편집하는 것보다는 컴파일러에게 중복 된 심볼 정의를 무시하도록하는 방법이없는 것처럼 보입니다. 이전에는 그러한 옵션 (예 : -m)이 있었지만 잠시 동안은 사용되지 않습니다. 따라서이 문제를 해결하기 위해 최소한 라이브러리 중 하나를 동적으로 만들어야했습니다.

두 번째 문제는 제가 링크하려고했던 라이브러리 중 하나가 libstdC++에 대해 컴파일 되었기 때문입니다. 그러나 Apple의 clang은 기본적으로 libC++에 대한 모든 것을 컴파일하려고합니다. 따라서 문제는 두 라이브러리 사이의 호환성 중 하나였습니다. std :: future_error는 런타임시 (libC++을 사용했을 때) libstdC++의 심볼을 찾을 수 없었습니다. 이 문제에 대한 적절한 해결책은 libC++를 사용하여이 프로젝트의 모든 라이브러리를 다시 컴파일하는 것입니다. 표준 라이브러리의 두 구현은 일반적으로 호환되지 않기 때문입니다.

어쨌든, 나는 이것이 다른 누군가에게 유용하게되기를 바랍니다. 필자는 리눅스가 여러 컴파일러에서 완벽하게 잘 작동하는 빌드를 보장하기 위해 애플이 충분히 달라야한다는 사실을 매우 실망스럽게 생각한다.

+0

마지막으로, C++ 라이브러리에 연결하는 내 문제를 해결합니다. 요세미티로 업그레이드하여 fink를 재구성 한 결과, 내 오래된 코드가 더 이상 "x86_64 아키텍처의 정의되지 않은 기호 :"와 같은 방식으로 연결되지 않음을 발견했습니다. 그건 그렇고, 더 이상 OSX의 ld에서 brute-force --start-group/end-group이 없어진 것 같습니다. –