2009-11-18 43 views
7

Chúng tôi đang sử dụng tiêu đề precompiled với GCC cho dự án của chúng tôi và xây dựng chúng như thế này:tiêu đề biên dịch sẵn và biên soạn đối tượng phổ cập trên OSX

gcc $(CFLAGS) precompiledcommonlib.h 

Bây giờ tôi đang xây dựng dự án trên OSX 10,6 và cố gắng sử dụng tiện lợi tính năng xây dựng cho tất cả các kiến ​​trúc cùng lúc như thế này:

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 

Tuy nhiên, có vẻ như điều này không làm việc cho các tiêu đề precompiled:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or directory) 

Chỉnh sửa: Như Mark đã chỉ ra theo XCode, tiêu đề được biên dịch trước phải được xây dựng riêng cho từng kiến ​​trúc, vì vậy câu hỏi của tôi là có cách nào để gcc sử dụng tiêu đề biên dịch trước khi xây dựng các đối tượng phổ quát.

Tôi nhận ra rằng tôi có thể xây dựng từng kiến ​​trúc hoàn toàn riêng biệt như XCode, nhưng tôi sẽ tận dụng khả năng xây dựng chúng cùng một lúc và không phải lộn xộn xung quanh với các cấu hình xây dựng khác nhau.

+0

Tôi chỉ cố gắng làm như vậy, và từ những gì tôi có thể thu thập , bạn _cannot_ tạo ra một tệp PCH trong khi đưa cho GCC hai cờ '-arch' của Apple.Các anh chàng Qt dường như đang làm điều gì đó kỳ lạ để làm việc này, bạn có thể muốn kiểm tra nó ... http://qt.gitorious.org/qt/qt/merge_requests/2193 – Lucas

Trả lời

2

Tôi chỉ chạy vào cùng một câu hỏi và theo dõi với liên kết được cung cấp bởi @lucas, vì vậy tôi nghĩ rằng tôi sẽ cung cấp những gì tôi tìm thấy ở đây.

Lưu ý đầu tiên, nếu bạn đang chuyển mã gcc của bạn từ Linux sang MacOS, phiên bản gcc do apple cung cấp không phát hiện đúng phần mở rộng tệp .hpp.

mac:openstudio lefticus$ g++ test.hpp 
ld: warning: ignoring file test.hpp, file was built for unsupported file format which is not the architecture being linked (x86_64) 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Như đã đề cập trong câu trả lời khác, tốt nhất bạn nên xác định đối số -x để đảm bảo gcc biết loại tệp bạn đang biên soạn.

g++ -x c++-header test.hpp 

Điều này tạo ra mong đợi test.hpp.gch.

Bạn có thể chỉ định bất kỳ kiến ​​trúc trên dòng lệnh và gch xây dựng đúng

g++ -x c++-header test.hpp -arch i386 

hoặc

g++ -x c++-header test.hpp -arch x86_64 

Nếu bạn cung cấp nhiều hơn một kiến ​​trúc, bạn nhận được lỗi poster đề cập.

mac:openstudio lefticus$ g++ -xc++-header test.hpp -arch i386 -arch x86_64 
Undefined symbols for architecture i386: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
Undefined symbols for architecture x86_64: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
lipo: can't open input file: /var/folders/DM/DMTpbjzHHX08IEqGgEAORE+++TI/-Tmp-//ccDeWigf.out (No such file or directory) 

Điều quan trọng là để biên dịch các kiến ​​trúc bạn cần riêng rẽ sau đó sử dụng lập luận -Xarch_ để nạp một điểm thích hợp trong biên soạn:

g++ -x c++-header -arch x86_64 x86_64/test.hpp 
g++ -x c++-header -arch i386 i386/test.hpp 

g++ -arch i386 -arch x86_64 test.cpp -Xarch_i386 -Ii386 -Xarch_x86_64 -Ix86_64 
+0

Tìm thấy tuyệt vời! Cảm ơn rất nhiều! – rasmusb

3

Vấn đề của bạn không phải là kiến ​​trúc. Cả hai đều không thành công

Vấn đề là bạn đang cố tạo một tệp thi hành mà không có chức năng chính.

Vì tên tệp là commonlib.c Tôi nghi ngờ bạn muốn xây dựng thư viện nếu bắt đầu dự án bằng mẫu thư viện trong XCode.

+0

Cảm ơn bạn đã dành thời gian. Thử 'gcc foo.h'. Nó ra sao? Bạn vẫn nghĩ rằng tôi đang cố gắng để xây dựng một thực thi? Sự vội vàng, chưa kể đến câu trả lời sai đơn giản và thái độ bảo trợ không phải là một sự kết hợp đặc biệt hấp dẫn. – rasmusb

+0

Tôi đã trộn lẫn các dòng lệnh xin lỗi. Tuy nhiên Các thông báo lỗi và dòng lệnh đang cố gắng xây dựng một tệp thực thi. - đó là lý do tại sao ld là dòng lệnh bằng cách đưa ra lỗi Tôi vẫn sẽ thiết lập điều này trong Xcode để có được tất cả các cờ chính xác. Nếu bạn đã có, bạn sẽ thấy rằng Apple biên dịch trước mỗi tiêu đề riêng biệt cho mỗi kiến ​​trúc và dòng lệnh bao gồm -x target-c-header -arch x86_64 Tài liệu của Apple cũng đề xuất tham số -x. amd chi tiết về kiến ​​trúc riêng biệt. – Mark

+0

Cuộc gọi tốt. Tôi nhận được lỗi đó khi tôi xây dựng một dự án mà không có phương pháp chính – surajz

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