2013-01-18 31 views
7

nhận được lỗi sau đây với lệnh g++ -o test -L . -l pqg ++ ném tập tin không được công nhận: định dạng tập tin không được công nhận lỗi

libpq.so: file not recognized: File format not recognized 

#file libpq.so 
libpq.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), not stripped 

phiên bản gcc 4.1.2 20.070.115 (SUSE Linux)

Tôi nhận được lỗi tương tự nếu tôi hãy thử sử dụng -l dbodbc thay vì -l pq.

Lưu ý rằng test.c là chương trình thế giới chào đơn giản.

Cảm ơn trước.

+0

Tôi đặt cược bạn đang cố gắng biên dịch điều này bằng phiên bản G ++ 32 bit. –

+0

mà g ++ hiển thị "/ usr/bin/g ++" và tệp trên/usr/bin/g ++ hiển thị "/ usr/bin/g ++: ELF 64-bit LSB thực thi, x86-64, phiên bản 1 (SYSV), cho GNU/Linux 2.6.4, được liên kết động (sử dụng libs được chia sẻ), bị tước bỏ ". Vì vậy, tôi nghĩ rằng điều này làm cho nó rõ ràng rằng g ++ là 64 bit – user1991251

+0

Đừng gọi chương trình của bạn 'test' nó là tên của một nội trang hệ vỏ. Và các lệnh 'file',' nm -D', và 'objdump -x' nói gì về' libpq.so' của bạn? –

Trả lời

6

file /usr/bin/g++ nói với bạn rằng g++ chính nó là một phiên bản 64-bit thực thi, tức là nó chạy trên một máy tính 64-bit, nó không làm cho bạn biết rằng g ++ có thể biên dịch mã 64-bit (đó là rất khó xảy ra nhưng nó có thể là trình biên dịch chéo cho một bộ xử lý hoàn toàn khác!) Sử dụng g++ -v hoặc g++ -dumpmachine để tìm hiểu mục tiêu mà nó tạo ra tệp thực thi.

G ++ không thực sự sử dụng thư viện đó, nó chỉ cần vượt qua các tùy chọn -l để mối liên kết, do đó lỗi là đến từ các mối liên kết, ld

Nếu ldobjdump đều nói rằng họ không thể nhận ra thư viện nhưng cùng một tập tin là tốt trên một máy khác nhau, tôi sẽ cố gắng cập nhật hoặc cài đặt lại gói binutils, cung cấp cả hai ldobjdump.

Bạn có thể cài đặt binutils 32 bit, do đó, ldobjdump của chúng tôi sẽ không hiểu thư viện x86_64. Đảm bảo bạn đã cài đặt RPM binutils 64 bit (tức là x86_64).

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