2014-12-22 20 views
5

Tôi đang viết một ứng dụng có nhiều thư mục con. Tôi đã tạo một cấu trúc Makefile sao cho các thư mục con biên dịch tập tin và thực hiện "ar rvs" và "ranlib libxxx.a" để tạo lưu trữ vào thư mục cha để liên kết.Gcc trên OS X: Biểu tượng không xác định cho kiến ​​trúc x86_64

Tuy nhiên, lệnh "ld" đang chạy vào sự cố sau.

ld: warning: ignoring file ./libxxx.a, file was built for archive which is not 
the architecture being linked (x86_64): 
./libxxx.a Undefined symbols for architecture x86_64: 

Tôi đang sử dụng gcc trên Mac OS X 10.10.1

Tôi đọc nhiều bài viết về vấn đề này. Tôi cố gắng "gcc -arch i386", sau đó tôi gặp phải lỗi tương tự cho i386

Undefined symbols for architecture i386: 

Tôi đã cài đặt gcc-4.9.2 và cố gắng sử dụng nó thay vì gcc mặc định, không có may mắn. Tôi đã thử sử dụng x86_64-apple-darwin14.0.0-g ++ - 4.9.2 và điều đó cũng không giúp được gì.

Trả lời

1

Các lỗi bạn đang thấy có nghĩa là bạn có hỗn hợp mã i386 và x86_64 trong bản dựng và bạn cần nhất quán. Trừ khi có một lý do thuyết phục để làm khác (tôi rất tò mò muốn biết nó là gì), bạn nên biên dịch mọi thứ chỉ với 64-bit. Sử dụng gcc trên máy Mac, thường là mặc định, nhưng bạn có thể ép buộc bằng cách thêm cờ -m64 vào bộ sưu tập. Một cách để làm điều đó là đặt CC="gcc -m64" trên dòng lệnh make; cũng có những cách khác tốt hơn, nhưng chi tiết phụ thuộc vào nội dung makefile của bạn.

Để giải quyết: trước tiên, hãy xóa tất cả thư viện và mã đối tượng bạn đã tạo trong khu vực dự án của mình (có thể make clean sẽ làm điều đó - nếu bạn đã viết mục tiêu clean). Sau đó, fettle giá trị của CC hoặc cờ của nó (CFLAGS cuối cùng, nhưng làm thế nào CFLAGS được xây dựng phụ thuộc vào makefile) để biên dịch 64-bit được thi hành. Sau đó, hãy chắc chắn rằng bạn đang sử dụng nó trong tất cả các bộ sưu tập. Nếu bạn không thấy số -m64, bạn gặp sự cố.

Nếu bạn phải sử dụng 32 bit, thay thế -m32 cho -m64.

Cuộc thảo luận ở trên giả sử bạn đang sử dụng gcc để chạy lệnh ld. Nếu bạn không, sau đó bạn đang ở trên của riêng bạn cho đến khi bạn sử dụng gcc để chạy lệnh ld. Theo quan điểm của tôi, bạn đã có những điều tốt hơn để làm với cuộc sống của bạn hơn là làm việc ra làm thế nào để chạy lệnh ld một cách chính xác; Tôi chắc chắn có.

+0

Cảm ơn bạn đã phản hồi. Tôi đã thử "CC = gcc -m64" và tôi cũng đã sử dụng gcc để chạy lệnh ld.But kết quả là như nhau. Tôi chỉ thử tùy chọn -m32 để xem nếu nó hoạt động nếu tôi làm cho nó phù hợp, nhưng không có lý do khác. – newprogrammer

+0

Không ai có thể giúp bạn nhiều hơn trừ khi chúng ta thấy một makefile tối thiểu tái tạo vấn đề. Đọc về cách tạo một MCVE ([Làm thế nào để tạo ra một ví dụ tối thiểu, đầy đủ và có thể xác minh?] (Http://stackoverflow.com/help/mcve)) hoặc SSCCE ([Ví dụ ngắn, tự chứa, đúng] (http://sscce.org/)) - hai tên và liên kết cho cùng một ý tưởng. Mã MCVE của bạn có thể là một tệp nguồn tối thiểu (và tiêu đề) cho thư viện ('void libfunc (void) {printf ("% s được gọi là \ n ", __func__);}' và chương trình chính của bạn gọi hàm thư viện, cộng với một hoặc hai makefiles tùy thuộc vào cách mọi thứ được đặt ra –

+0

Cảm ơn bạn. – newprogrammer

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