2010-04-07 34 views
14

Dự án Xcode của tôi được tạo thành các biến thể của cùng một sản phẩm bằng cách sử dụng hai mục tiêu. Sự khác biệt giữa hai chỉ là phiên bản của một thư viện được bao gồm được sử dụng. Đối với các tệp nguồn .c, thật dễ dàng để gán đúng phiên bản cho đúng mục tiêu bằng cách sử dụng hộp kiểm đích. Tuy nhiên, bao gồm cả các tập tin tiêu đề luôn luôn bao gồm cùng một. Điều này là đúng cho một mục tiêu, nhưng sai cho một mục tiêu khác.kiểm soát tệp tiêu đề dự án nào Xcode sẽ bao gồm

Có cách nào để kiểm soát tệp tiêu đề nào được bao gồm bởi mỗi mục tiêu không?

Đây là hệ thống cấp bậc của tôi tập tin dự án (được nhân rộng trong Xcode):

MyProject 
    TheirOldLib 
    theirLib.h 
    theirLib.cpp 
    TheirNewLib 
    theirLib.h 
    theirLib.cpp 
myCode.cpp 

và myCode.cpp làm những điều như:

#include "theirLib.h" 
… 
somecode() 
{ 
#if OLDVERSION 
    theirOldLibCall(…); 
#else 
    theirNewLibCall(…); 
#endif 
} 

Và tất nhiên, tôi xác định OLDVERSION cho một mục tiêu và không cho người khác.

Lưu ý rằng #include phải như được hiển thị. Cả hai lỗi thất bại với một tập tin không tìm thấy sau:

#include "TheirOldLib/theirLib.h" 
#include "TheirNewLib/theirLib.h" 

Vậy là có một cách để nói với Xcode mà theirLib.h bao gồm mỗi mục tiêu?

Ràng buộc:
- hai tệp tiêu đề có cùng tên. Như một phương sách cuối cùng, tôi có thể đổi tên một trong số họ, nhưng tôi muốn tránh điều đó vì điều này sẽ dẫn đến việc kéo tóc lớn trên các nền tảng khác.
- phải thay đổi #include để thêm tham chiếu vào thư mục kèm theo cũng là điều tôi muốn tránh, vì tôi cần thực hiện hai lần với chỉ thị biên dịch có điều kiện.
- Tôi hoàn toàn miễn phí để tinh chỉnh dự án của mình khi tôi thấy phù hợp

Cảm ơn bạn đã được trợ giúp.

Trả lời

21

Phần quan trọng của câu trả lời là sử dụng USE_HEADERMAP = NO như đề xuất của Chris trong nhận xét. Đây là những thông tin chi tiết.

công thức ngắn (kiểm tra trong Xcode 3.2.2):

  1. thêm một thiết lập tùy chỉnh xây dựng của USE_HEADERMAP = NO cho mỗi mục tiêu có liên quan. Dưới đây là cách thực hiện:
    1.1. Mở bảng thông tin của mục tiêu trên ngăn "Xây dựng".
    1.2. Kéo xuống menu bật lên hành động ở phía dưới cùng bên trái của cửa sổ, chọn "Thêm cài đặt do người dùng xác định".
    1.3. Trong dòng mới được thêm, hãy đặt cột đầu tiên ("Cài đặt") thành USE_HEADERMAP và cột thứ hai ("Giá trị") thành NO.

  2. thêm đường dẫn chính xác vào từng mục tiêu (nhắm mục tiêu Cài đặt xây dựng "Đường dẫn tìm kiếm tiêu đề"). Trong ví dụ của tôi là:
    2.1. thêm TheirOldLib cho mục tiêu "cũ"
    2.2.thêm TheirNewLib cho "mới" mục tiêu

Bước 1 vô hiệu hóa các tính năng bản đồ tiêu đề tự động của Xcode, thông qua đó bất kỳ tập tin tiêu đề bao gồm trong dự án có thể truy cập trực tiếp thông qua tên của nó, bất cứ con đường thực tế của nó. Khi hai tiêu đề có cùng tên, tính năng này dẫn đến sự mơ hồ không thể giải quyết được.

Bước 2 cho phép #include "theirLib.h" hoạt động mà không đủ điều kiện cho tệp tiêu đề đường dẫn thực tế.

Hai bước này cùng nhau hoàn thành hai ràng buộc của tôi.

Cuối cùng, USE_HEADERMAPkhông phải là được tài liệu của Apple, theo như tôi có thể biết. Tôi sẽ điền vào một báo cáo lỗi cho rằng, vì thiết lập này là rất quan trọng trong một số trường hợp, như googling cho nó tiết lộ. Được báo cáo là rdar: // 7840694. Ngoài ra trên Radar mở là http://openradar.appspot.com/radar?id=253401

+0

Điều này hoạt động hoàn hảo. Cảm ơn bạn. Người đăng nên đánh dấu phần này là Trả lời. – SmallChess

+2

Không nên trong bước 2. là "Đường dẫn tìm kiếm tiêu đề người dùng" thay vì "Đường dẫn tìm kiếm tiêu đề"? khi bạn sử dụng #include "" và không phải #include <> – Olof

+0

Tôi đoán bạn là chính xác. 'Đường dẫn tìm kiếm tiêu đề' hoạt động, nhưng' Đường dẫn tìm kiếm tiêu đề người dùng' sẽ tốt hơn. –

0

Tại sao bạn không thể sử dụng các đường dẫn bao gồm khác nhau trong mỗi mục tiêu?

+2

Nếu bạn có hai tiêu đề có cùng tên nhưng đường dẫn khác nhau, bạn cần đặt USE_HEADERMAP = NO trong cài đặt bản dựng tùy chỉnh trong cả hai mục tiêu. – cdespinosa

+0

Gọn gàng. Tôi đoán tôi chưa bao giờ thử. Tốt để thấy rằng Mike Ferris vẫn đang chiến đấu với cuộc chiến tốt chống lại khả năng sử dụng. –

+0

sử dụng các đường dẫn bao gồm khác nhau trong mỗi mục tiêu không hoạt động: bao gồm các tệp * trong * dự án luôn được Xcode truy cập mà không có đường dẫn nào cả. Đây là lý do tại sao vấn đề phát sinh ngay từ đầu: không có đường dẫn để phân biệt, có vẻ như không có cách nào để nói cho Xcode là tập tin phù hợp để đưa vào. Đề nghị của Chris là vô hiệu hóa tính năng đó, để đảo ngược với một sơ đồ đường dẫn bao gồm thông thường hơn. Tôi sẽ viết chi tiết câu trả lời. –

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