2012-01-21 30 views
7

Tôi đang cố gắng sử dụng Xcode để xây dựng một ứng dụng máy tính để bàn Objective-C liên kết với một thư viện tĩnh C++. Tôi đang sử dụng trình biên dịch clang của Apple. Tôi nhận được lỗi trình liên kết sau:Liên kết ứng dụng Objective-C tới thư viện tĩnh C++

Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin11.2.0 
Thread model: posix 
"/Developer/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -syslibroot /Developer/SDKs/MacOSX10.7.sdk -o /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug/sl marketplace analyitics.app/Contents/MacOS/sl marketplace analyitics -lcrt1.10.6.o -L/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -L/Users/andrew/Projects/sl-marketplace-analysis/platform/mac/sl marketplace analyitics/../../../../../Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -filelist /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Intermediates/sl marketplace analyitics.build/Debug/sl marketplace analyitics.build/Objects-normal/x86_64/sl marketplace analyitics.LinkFileList -framework Cocoa -lcore -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a -F/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug 
Undefined symbols for architecture x86_64: 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Có vẻ như nó không liên kết với thư viện std C++. Đây có phải là vấn đề và nếu có, làm thế nào để tôi đảm bảo rằng nó liên kết với nó?

Cập nhật:

Nếu tôi thêm một tập tin cpp trống để xây dựng sau đó tất cả mọi thứ biên dịch và chạy tốt. Tôi chỉ có vẻ cần một cách để nói cho linker liên kết với thư viện std C++. Tôi đã thử xem xét tất cả các thiết lập xây dựng trong Xcode nhưng dường như không thể tìm thấy bất cứ điều gì giúp.

Trả lời

17

Hãy thử thêm -lstdC++ hoặc -lC++ (tùy thuộc vào C++ runtime thư viện tĩnh của bạn hy vọng) để "Flags Linker khác" dưới "Xây dựng Setting":

enter image description here

+0

Tôi gặp phải vấn đề tương tự và đang tìm giải pháp này cho cả ngày Cảm ơn bạn đã chia sẻ nó, hoạt động như một sự quyến rũ –

+1

Cảm ơn bạn !!! Tôi ha d là một thư viện tĩnh là sự kết hợp của Objective-C, C++ và Objective-C++.Bản thân thư viện không bao gồm cờ này khi xây dựng nhưng yêu cầu vì một số lý do khi sử dụng thư viện trong ứng dụng iOS của tôi. Tôi không biết tại sao. – jocull

+0

@jocull: Khi bạn xây dựng một thư viện tĩnh, các tệp kết quả không được liên kết, do đó thư viện không được yêu cầu cho đến khi tệp lưu trữ được liên kết như là một phần của ứng dụng cuối cùng. –

1

Có vẻ lạ khi libcore.a đang tìm kiếm một lớp có tên Init trong không gian tên std::ios_base. Tôi không nghĩ rằng std::ios_base::Init là một lớp tiêu chuẩn.

Ngoài ra, bạn có thể muốn kiểm tra xem libcore.a có thực sự bao gồm mã x86_64 hay không. Bạn có thể sử dụng lệnh file để kiểm tra. Ví dụ:

$ file /usr/lib/libz.dylib 
/usr/lib/libz.dylib: Mach-O universal binary with 2 architectures 
/usr/lib/libz.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 
/usr/lib/libz.dylib (for architecture i386): Mach-O dynamically linked shared library i386 

Nếu đầu ra file lệnh không bao gồm một “for architecture x86_64” dòng, bạn không thể sử dụng thư viện để tạo ra một phiên bản 64-bit thực thi.

+0

Tôi cũng có quyền kiểm soát thư viện đó (tôi đang xây dựng nó trong cùng một vùng làm việc Xcode. Nó được xây dựng với x86_64. – drewag

-1

Flags Linker khác -lstdC++ Không giúp tôi trong Xcode5. Nhưng tìm ra điều tương tự trong của Apple LLVM 5.0 - Lnaguage - C++

thiết lập mặc định là libC++ (LLVM chuẩn C++ ~ blabla) và thay đổi nó để libstdC++ (GNU điều)

Bây giờ có không có lỗi với liên kết !!! và bây giờ tôi phải tìm ra nó chạy tốt.

dù sao, xin cảm ơn lời khuyên.

+0

Cùng một vấn đề - -lstdC++ dường như không có hiệu lực trong Xcode5. Đề nghị sửa chữa trong câu trả lời này không có hiệu lực (và không nên) – Adam

+0

Vâng, nếu bạn sử dụng libC++, bạn nên liên kết với libC++. Nếu bạn sử dụng libstdC++ (cũ và không được chấp nhận, vì vậy đừng), bạn nên liên kết với libstdC++. –

2

Có cùng một vấn đề với Xcode 6, tôi đã giải quyết nó bằng cách liên kết "libstdC++. 6.0.9.dylib" trong "liên kết nhị phân với Libraries" xây dựng giai đoạn & thêm -lstdC++ để "khác Linker Flags "bên dưới Build Setting

+0

Cảm ơn Urmi, điều này đã giải quyết được vấn đề của tôi, mặc dù tôi KHÔNG cần phải thêm -lstdC++ vào "Other Linker Flags". Trong trường hợp của tôi, bản thân ứng dụng đích là Obj-C thuần túy và KHÔNG cần C++, cả ngôn ngữ lẫn thư viện chuẩn. Tuy nhiên, tôi cần liên kết với các thư viện tĩnh bên thứ ba mà sử dụng nhiều C++ (ví dụ: công cụ âm thanh/video mà chúng tôi đã mua). Vì chúng là các lib tĩnh, chúng ta phải "trợ giúp chúng" bằng cách thêm các lib chuẩn C++ vào ứng dụng của chúng ta. vì một số lý do Xcode KHÔNG làm điều này tự động. –

Các vấn đề liên quan