2010-06-25 36 views
25

Khi tôi cố gắng biên dịch một bản sao dự án của mình trên máy cục bộ, tôi nhận được thông báo lỗi rằng nó bỏ qua các thư viện không tương thích. Đây không phải là trường hợp khi tôi đang rối tung xung quanh với phiên bản trực tiếp được lưu trữ trên máy chủ tại nơi làm việc [nó hoàn toàn ở đó].Bỏ qua các thư viện không tương thích khi biên dịch

Nhiều trang web khác đã khiến tôi tin rằng đây có thể là vấn đề môi trường vì tôi đang phát triển bản phân phối Ubuntu 64 bit và tôi cho rằng phiên bản máy chủ đang chạy trên 32 bit. Tuy nhiên, sau khi cài đặt biến môi trường của tôi để:

CFLAGS+=" -m32" 
CXXFLAGS+=" -m32" 

tôi vẫn nhận được lỗi biên dịch cùng:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http 

thể Haz hướng dẫn?

== Sửa ==

Đây là kết quả tôi nhận được khi tôi theo Jonathan lời khuyên:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

Rõ ràng, các thư viện trong câu hỏi là 32-bit sau khi tất cả?

+1

Thư viện đó có chắc chắn là 32 bit không? Hãy thử 'file/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: đó là khả năng nói 'bản lưu trữ ar hiện tại', điều này không thực sự hữu ích. Bạn phải nhận được một tập tin bên trong kho lưu trữ, như được hiển thị trong câu trả lời của tôi. –

+0

Hãy đăng dòng lệnh linker ... bạn nói đúng, có vẻ như thư viện là 32-bit, nhưng có thể người liên kết đang tìm kiếm các thư viện 64 bit mặc dù bạn nghĩ mình đã làm gì. –

Trả lời

28

Thông báo đó không thực sự là lỗi - chỉ là cảnh báo rằng tệp được đề cập không phải là kiến ​​trúc phù hợp (ví dụ: 32 bit so với 64 bit, kiến ​​trúc CPU sai). Trình liên kết sẽ tiếp tục tìm kiếm một thư viện đúng loại.

Tất nhiên, nếu bạn cũng đang nhận được một lỗi dọc theo dòng của can't find lPI-Http sau đó bạn có một vấn đề :-)

Thật khó để đề nghị những gì các phương thuốc chính xác sẽ được mà không biết các chi tiết của hệ thống xây dựng của bạn và makefiles, nhưng đây là một vài bức ảnh trong bóng tối:

  1. Chỉ cần kiểm tra: thường bạn sẽ thêm cờ để CFLAGS hơn CTAGS - bạn có chắc đây là có đúng không? (Những gì bạn có thể chính xác - điều này sẽ phụ thuộc vào hệ thống xây dựng của bạn!)
  2. Thường cờ cần phải được truyền cho các mối liên kết quá - vì vậy bạn cũng có thể cần phải sửa đổi LDFLAGS

Nếu điều đó không giúp - bạn có thể gửi kết quả báo lỗi đầy đủ, cộng với lệnh thực tế (ví dụ: gcc foo.c -m32 -Dxxx vv) đang được thực hiện?

+1

Tôi xin lỗi, bạn nói đúng. Tôi đã sử dụng CFLAGS thay vì CTAGS: P –

+0

Ngoài giải pháp này, bạn có thể thêm '-Wl, - no-warn-search-mismatch' vào' CFLAGS' của bạn, do đó những cảnh báo này bị chặn lại. –

9

Thông thường, đó không phải là lỗi cho mỗi lần truy cập; nó là một cảnh báo rằng tệp đầu tiên mà nó tìm thấy khớp với đối số -lPI-Http tới trình biên dịch/trình liên kết không hợp lệ. Lỗi xảy ra khi không tìm thấy thư viện nào khác có nội dung phù hợp. Vì vậy, bạn cần xem xét xem /dvlpmnt/libPI-Http.a là thư viện các tệp đối tượng 32 bit hoặc tệp đối tượng 64 bit - có khả năng là 64 bit nếu bạn đang biên dịch với tùy chọn -m32. Sau đó, bạn cần phải xác định xem có một tệp thay thế libPI-Http.a hoặc libPI-Http.so ở một nơi khác 32 bit hay không. Nếu vậy, hãy đảm bảo rằng thư mục chứa nó được liệt kê trong một đối số -L/some/where cho trình liên kết. Nếu không, sau đó bạn sẽ cần phải có được hoặc xây dựng một phiên bản 32-bit của thư viện từ một nơi nào đó.

Để thiết lập những gì có trong thư viện đó, bạn có thể cần phải làm:

mkdir junk 
cd junk 
ar x /dvlpmnt/libPI-Http.a 
file *.o 
cd .. 
rm -fr junk 

Các 'file' bước cho bạn biết những gì loại file đối tượng là trong kho lưu trữ. Phần còn lại chỉ đảm bảo bạn không tạo ra một mớ hỗn độn mà không thể dễ dàng làm sạch.

+1

Rất tiếc, bước này hiện đang cho tôi thấy rằng tất cả các Thư viện được đề cập là, trên thực tế, 32 bit. o__o –

+1

@defaultstring: Dòng lệnh liên kết thực tế là gì? Nó có bao gồm cờ '-m32' không? Thêm thông tin đó làm thông tin bổ sung trong câu hỏi, thay vì làm thêm nhận xét tại đây, vui lòng. –

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