2014-02-12 1 views
0

저는이 유산 프로젝트를 가지고 있습니다.이 프로젝트는 iOS 7 및 Xcode 5에 가져 오려고합니다. 2004 년의 유산과 마찬가지.C++을 Xcode 5와 연결하는 데 문제가 있습니다.

어쨌든, 나는이 물건을 만들려고 노력하고 있으며, 몇몇 일반적인 서드 파티 라이브러리를 포함한 몇 개의 라이브러리를 뱉어 낸다. 링크 할 때, 나는이 같은 오류를 얻을 :

Undefined symbols for architecture ${arch}: 
    "google::protobuf::internal::WireFormatLite::WriteBytes(int, std::string const&, google::protobuf::io::CodedOutputStream*)" 

nm와 검사시 이전 (ARM에만 해당) 아직 프로젝트에 포함 된 바이너리 라이브러리이 포함

  U __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPNS0_2io17CodedOutputStreamE 
00000a8c T __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPNS0_2io17CodedOutputStreamE 
00002b28 S __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPNS0_2io17CodedOutputStreamE.eh</code> 

새로운 라이브러리 (보편적 인) 내가 엑스 코드 (5)을 통해 프로젝트를 실행할 때 생성 (따라서, 그 소리/LLVM)이 포함되어 매개 변수가 변환 된 이름에 누락처럼 나에게

  U __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKSsPNS0_2io17CodedOutputStreamE 
00000514 T __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKSsPNS0_2io17CodedOutputStreamE 
00000b2c S __ZN6google8protobuf8internal14WireFormatLite10WriteBytesEiRKSsPNS0_2io17CodedOutputStreamE.eh 

, 그것은 보인다.

정상입니까? 다른 곳을 찾아야합니까?

또는 이것이 문제인 경우 : 어떻게 해결할 수 있는지 생각해보십시오.

편집 : OLD와 NEW가 혼합되었습니다. 원본 게시물을 변경하지 않고 그대로 두었습니다.

답변

0

SDK 또는 컴파일러를 섞어서 사용하고 있습니까? 이름 변환은 컴파일러에 따라 다를 수 있습니다. 내가 맹 글링에 영향을 미칠 수있는 유일한 사실은 'extern'C ''키워드이지만, 일반적으로 완전히 끈적하기 때문에 생각하지 않습니다.

그래도 이전 코드가 GCC 2.x로 작성되었으며 새 코드가 clang 빌드 된 경우에는 다른 코드가 사용 된 것일 수 있습니다.

오류 메시지가 실제로 $ (arch)입니까? 특정 아키텍처가 아닌가요? 구체적인 아키텍처를 제공했다면, 예를 들어 빌드하는 프로젝트가 하나 있다고 기대할 수 있습니다. arm5 및 arm6의 경우 이러한 아키텍처 중 하나만있는 라이브러리에 링크됩니다. 그렇다면 일반적으로 라이브러리에있는 기호가 사용 가능하지 않다는 것에 불만이 있다고 생각합니다.

+0

는 (아니, $ {아치} 그 다음 내가 추측 말이 내가, 내가 과거와 혼합해서 죄송 것입니다 모두 팔 및 x86} – below

2

옛는, 팔은 libary를 표시하는 것 : libstdC++를 컴파일되는 모든 특징을 가지고

google::protobuf::internal::WireFormatLite::WriteBytes(int, std::string const&, google::protobuf::io::CodedOutputStream*) 

합니다.

새 범용 라이브러리를 나타냅니다 :

google::protobuf::internal::WireFormatLite::WriteBytes(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, google::protobuf::io::CodedOutputStream*) 

이는 libc의 컴파일되는 모든 특징을 가지고 ++

귀하의 링크 오류가 발견 문제가 있음을 나타냅니다

google::protobuf::internal::WireFormatLite::WriteBytes(int, std::string const&, google::protobuf::io::CodedOutputStream*) 

이 라이브러리에 연결하는 코드가 libstdc++을 사용하여 컴파일되고 새 유니버설 라이브러리가를 사용하여 컴파일 되었기 때문에코드가 링크되지 않습니다.

모두을 동일한 libC++/libstdC++를 지원하도록 컴파일해야합니다. 링크를 거부하기 때문에 혼합하여 일치시킬 수 없습니다.프로젝트의 모든 요소가 동일한 C++ 표준 라이브러리를 사용하여 컴파일되었는지 확인하고 링크 오류를 해결해야합니다. 일반적으로

( c++filt 사용) 기호를 디맹 글링은 적절한 서명을 볼 수 있으며,이 코드의 경우, 일단 기호에 std::__1::을보고 시작, 그것은 라이브러리가 libc++를 사용하여 컴파일 된 것을 나타내고, 이 링크는 (내부 __1::없이 예) 꾸밈 std:: 기호 실패 볼 때, 다음의 링크를 수행 할 항목이 libstdc++를 사용하고 있음을 나타냅니다.

+0

, 실패 표시하기를 넣어. 그 것 아마 것을 나타냅니다 난 아직도 된 libstdc 연결됩니다에 연결하고있는 응용 프로그램은 ++, 맞죠? – below

+0

그것은 당신이 과거와 현재의 대한 언급 주위를 교환하는 경우는 protobuf 기반 라이브러리가 현재의 libC++로 구축되었음을 나타냅니다 가능성이 높습니다 보인다 및 응용 프로그램은로 건설되고있다 libstdC++ - 이것은 잘못된 링크 라인이 주장하는 것입니다. 앱에서 링크하기위한 서명은 이것이 문제라는 것을 나타내는 것 같습니다 (실행이 끝나면 대답을 업데이트 할 것입니다) – Petesh

관련 문제