2014-07-21 4 views
4

이전에 Poco C++ (내가 좋아하는 방식으로)를 사용하는 간단한 명령 줄 프로그램을 컴파일했습니다. 이 프로그램은 몇 개월 동안 완벽하게 운영되었습니다.Poco C++에서 정의되지 않은 기호

프로그램을 실행할 때 다음 오류가 발생하므로 컴퓨터에서 몇 가지 사항이 변경되어야합니다.

dyld: Symbol not found: __ZN4Poco4Util11Application12handleOptionERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESA_ 
    Referenced from: /Users/me/bin/sqlmerge 
    Expected in: /usr/local/opt/poco/lib/libPocoUtil.16.dylib 
in /Users/me/bin/sqlmerge 

왜 이런 일이 발생하는지 알려주실 수 있습니까? Poco 1.4.6으로 컴파일하고 Poco 1.4.6과 함께 실행했습니다. 이유는 Poco가 컴퓨터에서 사라져서 brew install poco (저는 분명히 Mac에서 실행 중입니다)으로 다시 설치해야했습니다.

수정 : 원인을 알 수는 없지만 --c++11 옵션을 사용하여 다시 설치하면 문제가 해결됩니다. 예컨대 :

brew install poco --c++11 

는 아마도 약간 엉망으로는 C++ 이름은 C++ 11로 C++ 표준의 이전 버전에서 변경?

답변

1

C++에는 응용 프로그램 바이너리 인터페이스가 없습니다. 이로 인해 사람들이 컴파일러 버전을 업그레이드 할 때 재 컴파일을 강요하는 것을 포함하여 많은 두통이 발생합니다. 같은 컴파일러, 다른 버전, 다른 이름으로 mangling. 이것이 대부분의 라이브러리가 C 인터페이스를 갖는 이유입니다. 역사적인 이유로 C 인터페이스는 알려진 모든 플랫폼에서 안정적인 이름 변환 기능을 제공합니다.

http://morpher.com/documentation/articles/abi/ C++ ABI issues list

허브 셔터는 안정적인 플랫폼 C에 대한 ABI ++ 제안했다. 그래서 도움이 될 수 있습니다 :-)

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4028.pdf