Xây dựng ứng dụng 32 bit trong Ubuntu 64 bit


23

Sau nhiều giờ googling, tôi quyết định từ bỏ và hỏi các chuyên gia. Tôi đang cố gắng xây dựng một ứng dụng 32 bit (xgap nếu có ai quan tâm) trong 64 Ubuntu 11.10 của tôi. Tôi đã thêm CFLAGS = -m32LDFLAGS = -L / usr / lib32 trong tệp thực hiện. Các đối tượng được xây dựng thành 32 bit tốt. Bước cuối cùng là liên kết tất cả các đối tượng và thư viện cho các cửa sổ X vào tệp thực thi --- xgap này. Bằng cách nào đó nó liên tục cho tôi lỗi này:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

Tôi đã cài đặt ia32-libshỗ trợ mutilib . Tôi nghĩ rằng tôi chỉ cần buộc trình liên kết tạo ra một đầu ra i386. Tôi đã cố gắng đặt hai cờ ld trong lệnh gcc của mình như được hiển thị ở trên: -melf_i386-oformat elf32-i386 . Nhưng điều xảy ra là gcc không tìm kiếm thư viện 32 bit trong / usr / lib32 nữa. Tôi tự hỏi nếu tôi cần phải đặt những lá cờ theo thứ tự cố định?

Cảm ơn cho bất kỳ ý tưởng và giúp đỡ!

EDIT: khi tôi thêm cờ -m32 trong lệnh gcc cuối cùng của mình (giai đoạn liên kết mà tôi tin), ngay cả khi tôi có cờ -L / usr / lib32, gcc không tìm kiếm trong / usr / lib32 nữa (thực sự lạ ...) và tạo ra lỗi sau:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Bất cứ ai có bất kỳ ý tưởng tại sao điều này xảy ra? Tôi đang sử dụng công cụ tự động để cấu hình và thực hiện. Tôi thực sự giỏi trong việc sửa đổi các tập tin script.

EIDT : Tôi đã giải quyết vấn đề. Tôi nghĩ rằng gcc đã mong đợi một kho lưu trữ thư viện tĩnh. Tôi đã sử dụng tập lệnh getlibs từ http://ubuntuforums.org/showthread.php?t=474790 để tải xuống tất cả các tài liệu lưu trữ .a cần thiết để liên kết. Sau đó gcc làm việc. Tôi nghĩ gcc đã tìm kiếm trong thư mục / usr / lib32 nhưng không tìm thấy kho lưu trữ .a nên đã tìm kiếm trong thư mục tiêu chuẩn là / usr / lib , nơi nó tìm thấy các tệp * .so không tương thích .

Nhưng câu hỏi đặt ra là: các tệp * .so trong / usr / lib32 / từ gói ia32-libs không thực sự có các thư viện cần thiết để liên kết? Những tập tin trong / usr / lib32 / được sử dụng để làm gì?



Câu trả lời:


15

LDFLAGSnên bao gồm -m32là tốt. Sau đây nên làm việc:

export LDFLAGS='-m32 -L/usr/lib32'

Trên thực tế, bạn có thể bỏ -L/usr/lib32một phần, vì đây là thư mục mặc định cho lib 32 bit và hệ thống của bạn biết về điều đó.

Về cơ bản, cách đơn giản nhất để xây dựng ứng dụng 32 bit trên máy 64 bit là:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. hoặc cung cấp các biến đó để định cấu hình tập lệnh nếu bạn đang sử dụng autotools.

CẬP NHẬT:

Có vẻ như bạn không thực sự quen thuộc về sự khác biệt trong liên kết với các thư viện tĩnh và động. Tôi sẽ cố gắng tối thiểu nhất có thể:

  • Cả thư viện phát triển tĩnh và động đều có cùng phần mở rộng tệp .a
  • Nếu bạn đã cài đặt cả phiên bản tĩnh và phiên bản động của cùng một thư viện, một trong số chúng có thể có thêm hậu tố, như libname.ađối libname_s.avới phiên bản động và phiên bản tĩnh.
  • Chắc chắn, phiên bản thư viện tĩnh và động khác nhau về kích thước. Phiên bản tĩnh nặng hơn.
  • Nếu bạn liên kết với thư viện tĩnh - ứng dụng của bạn không có phụ thuộc. Nếu bạn liên kết với thư viện động, nó sẽ dựa vào .sothư viện thời gian chạy nên có trong hệ thống của bạn.

Xin lưu ý, chúng tôi không nói về các thủ thuật nâng cao ở đây, như tải DSO rõ ràng bằng cách sử dụng API dlopen () / dlsym ().


Bây giờ tôi nghĩ rằng có một cái gì đó sai với thiết lập của tôi. Bất cứ khi nào tôi thêm -m32 vào lệnh gcc cuối cùng của mình, nó sẽ tìm kiếm thư mục / usr / lib. Nếu tôi không thêm -m32 và sử dụng cờ -L / usr / lib32, nó sẽ tìm đúng thư mục nhưng tạo ra các lỗi ở trên. Bạn có biết những gì có thể gây ra điều này?
Giàu

Và điều gì sẽ xảy ra nếu bạn kết hợp cả hai (như trong ví dụ của tôi ở trên)?
Andrejs Cainikovs

nếu tôi kết hợp cả hai, nó vẫn không tìm kiếm trong / usr / lib32. nó chỉ tìm kiếm trong / usr / lib. Và btw, tôi đang sử dụng các công cụ tự động.
Giàu

Thật lạ .. Bạn đã thử cho ăn -l/usr/lib32/libXaw.sothay thế?
Andrejs Cainikovs

Nó không thể tìm thấy chúng ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: không thể tìm thấy -l / usr / lib32 / libXaw.so
Rich

9

Tôi đã nhận được các lỗi như:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

CÁi này đã sửa nó giúp tôi:

sudo apt-get install g++-multilib

nếu bạn đang sử dụng gói gcc khác với gói mặc định (ví dụ gcc-7), thì bạn sẽ cần cài đặt gói cho phiên bản cụ thể đó:

sudo apt-get install g++-7-multilib

1
g++-multiliblà cho g ++ (C ++), cho gcc (C) bạn cũng cần gcc-multilib.
pevik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.