2013-07-04 43 views
11

Trong dự án iOS của tôi, tôi cần sử dụng thư viện bên ngoài được viết bằng C++. Các tệp tiêu đề C++ đều nằm trong một thư mục.Sử dụng các tiêu đề C++ bên ngoài trong Mục tiêu-C

Tôi đã thêm các tiêu đề C++ này vào dự án Xcode của mình và cũng đã chỉ định đường dẫn tìm kiếm tiêu đề (trong Cài đặt bản dựng).

Vấn đề là các tiêu đề C++ này bao gồm nhau bằng cách sử dụng <> dấu ngoặc nhọn. Điều này dẫn đến:

'filename.h' file not found with <angled> include, use "quotes" instead. 

Điều kỳ lạ là Xcode không phàn nàn về tất cả các tiêu đề. Ngoài ra cùng một tiêu đề # include'd trong một tệp là tốt, trong khi một vấn đề khi # include'd trong một tệp khác. Tôi nghĩ rằng điều này là do thực tế rằng các tiêu đề #include lẫn nhau.

  1. Tại sao đường dẫn tìm kiếm không hoạt động?
  2. Có cách nào để giải quyết vấn đề này mà không sửa đổi các tệp tiêu đề này không?

Cảm ơn!

+0

Bạn có nguồn và dự án Xcode của thư viện C++ đó không? – CouchDeveloper

+0

@CouchDeveloper Không, tôi không biết. –

+4

Cài đặt trợ giúp "Luôn tìm kiếm đường dẫn người dùng" có giúp được không? –

Trả lời

26
#include <bla.h> 

có nghĩa là cho thư viện hoặc khung tiêu đề chuẩn, và các chiến lược tìm kiếm là khác nhau hơn so với sử dụng cho

#include "bla.h" 

Xem ví dụ

Để giải quyết sự cố, bạn có thể đặt t ông Xcode xây dựng cài đặt "Luôn tìm kiếm đường dẫn người dùng" thành CÓ.

+1

Lưu ý rằng cài đặt "Luôn luôn tìm đường dẫn người dùng" thành CÓ có thể gây ra vấn đề tiêu đề. Bạn nên đặt nó là KHÔNG, và đó là cách chính xác. Nó vẫn chỉ ở đó cho sự tương thích ngược. Tiêu đề của thư viện của bên thứ ba phải được bao gồm qua dấu ngoặc nhọn. – CouchDeveloper

+0

@CouchDeveloper: Nó có ý nghĩa như một cách giải quyết, nhưng bạn đúng và câu trả lời của bạn có lẽ là giải pháp tốt hơn. –

+0

@CouchDeveloper đồng ý rằng cài đặt này phải được đặt thành KHÔNG, nhưng có bất kỳ điều gì không mong muốn đặt cài đặt này thành CÓ trong bối cảnh xây dựng một khung công tác nhúng không? –

11

Bắt đầu từ một dự án ứng dụng "trống":

  1. Tạo một thư mục "Thư viện" trong dự án ứng dụng của bạn - một lợi thế như một anh chị em để tập MyApp.xcodeproj của bạn, nhưng nó có thể là bất cứ nơi nào. Tạo các thư mục con cho mỗi Cấu hình (Gỡ lỗi, Phát hành, vv) và có thể cho mỗi kiến ​​trúc (armv7, armv7s, arm64) trừ khi nhị phân là kho lưu trữ nhị phân chung chứa tất cả các kiến ​​trúc.

  2. Lấy tiêu đề thư viện của bên thứ ba và thư viện tĩnh (có thể nhiều hơn một cho các nền tảng khác nhau, Cấu hình và kiến ​​trúc) và di chuyển chúng vào thư mục "Thư viện" vào các thư mục con tương ứng (mà bạn có thể cần tạo):

    Ví dụ, giả sử bạn đã có một nhị phân phổ quát (ARMv7, armv7s, arm64) và Debug và Release phiên bản của thư viện đó: Bây giờ, cấu trúc thư mục được giả định là như sau:

    $(SRCROOT)/Libraries 
        Debug-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
        Release-iphoneos 
         include 
          ThirdParty 
           third_party.hh 
           ... 
         libThirdParty.a    
    MyApp.xcodeproj    
    
  3. "Đường dẫn tìm kiếm thư viện" Xây dựng Se tting:

    Kéo thư mục "Thư viện" vào dự án Xcode của bạn. Điều này có thể tự động tạo đường dẫn tìm kiếm thư viện trong cài đặt bản dựng. Vui lòng xác minh điều này và nếu nó không chính xác, hãy sửa nó.

    Với ví dụ này, thêm các đường dẫn tìm kiếm thư viện sau đây để Debug và Release Cấu hình:

    gỡ lỗi: Library Search Paths: $(SRCROOT)/Libraries/Debug-iphoneos

    phát hành: Library Search Paths: $(SRCROOT)/Libraries/Release-iphoneos

    Bạn có thể có các đường dẫn tìm kiếm thư viện khác nhau cho các cặp nền tảng Cấu hình và Nhắm mục tiêu cụ thể. Đặt đường dẫn khác nhau trong cài đặt bản dựng tương ứng.

  4. "Header Search Paths" Build Setting:

    Với ví dụ này, thêm các đường dẫn tìm kiếm tiêu đề sau đây để gỡ lỗi và Configuration phát hành:

    gỡ lỗi: Tiêu đề Search Paths: $(SRCROOT)/Libraries/Debug-iphoneos/include

    Bản phát hành: Đường dẫn tìm kiếm tiêu đề: $(SRCROOT)/Libraries/Release-iphoneos/include

    Tương tự như vậy, bạn có thể có các đường dẫn khác nhau cho các cặp Config/Target cụ thể - mặc dù các tiêu đề có thể giống nhau.

  5. Liên kết ứng dụng của bạn với thư viện chuẩn C++ bằng cách thêm -lc++ vào Cờ liên kết khác cài đặt bản dựng.

  6. nhập tiêu đề trong các tập tin của bạn như sau:

    #import <ThirdParty/third_party.hh> 
    
+0

Điều đó đã giúp, vì lỗi đó phụ thuộc vào mục tiêu trong trường hợp của tôi. –

+0

Sử thi, lần đầu tiên tôi có thể làm cho góc bao gồm làm việc với một thư viện bên thứ 3 mà tôi có trong dự án của tôi bởi vì tôi muốn vá nó. Cảm ơn. – aledalgrande

1

Trong XCode sau khi cài đặt "User Tiêu đề Search Paths" để trỏ đến thư mục thư viện của bạn, bạn cũng phải đảm bảo rằng một lĩnh vực được gọi là "Luôn luôn tìm kiếm tài Paths" được thiết lập để "Yes"

này đã giải quyết được vấn đề tôi gặp phải: với < tăng/signals2.hpp > tập tin không tìm thấy với < góc > bao gồm, sử dụng "dấu ngoặc kép" thay thế.

1

Trong Xcode 9, tôi cần thêm đường dẫn tệp tiêu đề vào cài đặt xây dựng Header Search Paths, chứ không phải User Header Search Paths.

Xcode sẽ nối thêm User Header Search Paths để biên dịch lệnh dưới dạng -iquote tùy chọn, nhưng thêm Header Search Paths làm tùy chọn -I. Đó là sự khác biệt chính.

+0

Cảm ơn bạn đã chỉ ra điều này. (Tôi đã không có thời gian để kiểm tra nó mặc dù, tôi tin tưởng bạn.) –