2009-11-04 26 views
10

Các giải pháp trongLàm thế nào để biên dịch một số nhị phân 32-bit trên một máy Linux 64-bit mà không cần chạm môi trường CFLAGS biến

How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake

là không thể vì tôi sử dụng phần mềm của bên thứ 3 và thứ khác đó là sử dụng biến CFLAGS. Và không cho phép vá các makefiles của họ - ông chủ của tôi nói.

Vì vậy, tôi phải tìm cách khác để thực thi nó. Có lẽ một số phép thuật với các liên kết tượng trưng chuyển hướng cuộc gọi đến gcc sang phiên bản 32bit của trình biên dịch (hy vọng rằng mục tiêu mặc định không được phát hiện động).

+0

Đây có phải là "phần mềm của bên thứ 3 và các nội dung khác" một sự phụ thuộc cần được biên soạn khi xây dựng nhị phân 32 bit của bạn không? –

Trả lời

14

Bạn không được phép thay đổi CFLAGS trong môi trường của mình, nhưng có bất kỳ lý do nào bạn không thể ghi đè tạm thời cho bản dựng không?

Đối với một gói Autotool dựa trên, đầu tiên tôi sẽ cố gắng:

CFLAGS="-m32" ./configure [opts] 
make 
make install 

Một bài báo hay configure.ac tập tin nên tôn trọng CFLAGS bạn biến và gắn với nó, mà không đòi hỏi bạn phải sửa đổi mã nguồn gói.

Cập nhật

Giả sử, sau đó, rằng bạn không thể xác định lại biến CC của bạn, một trong hai, tôi sẽ chơi một số thủ thuật con đường. Thực hiện một kịch bản shell trong ${HOME}/gcc32 gọi gcc như sau (chưa được kiểm tra):

#!/bin/sh 
/usr/bin/gcc -m32 "[email protected]" 

Sau đó thêm vào trước này để đường dẫn của bạn khi bạn muốn xây dựng 32-bit:

export PATH=${HOME}/gcc32:${PATH} 

sửa đổi hiển nhiên sẽ hỗ trợ g++, icc hoặc bất kỳ trình biên dịch nào khác.

+0

Thật không may là makefile tự đặt CFLAGS và thậm chí tệ hơn nó đang làm điều này dựa trên một loạt các điều kiện. Vì vậy, tôi không thể dễ dàng yếu tố này vào định nghĩa CFLAGS bên ngoài của tôi. Các nhà văn makefile nên đã sử dụng một tên biến và trái CFLAGS cho mục đích dự định của nó, nhưng đây là mã như nó được. – Lothar

+0

Kết hợp thông tin mới này trong bản cập nhật ở trên – jvasak

+0

Bạn cần sử dụng đường dẫn tuyệt đối, nếu không bạn sẽ nhận được đệ quy vô hạn. –

2

Giả sử gcc và bạn bè được đặt trong "/ usr/bin". Chúng ta cũng giả sử rằng bạn có một thư mục có tên "~/.local/bin" nằm trong đường dẫn của bạn. Bạn có thể tạo một kịch bản bash có tên là "gcc" trong "~/.local/bin" như:

 
#! /bin/bash 
/usr/bin/gcc -m32 [email protected] 

bạn tương tự có thể tạo ra một "g ++" kịch bản với nội dung như sau:

 
#! /bin/bash 
/usr/bin/g++ -m32 [email protected] 

Về cơ bản, tiếp tục làm điều này cho "C++", "cc", "as", "ld", v.v. nếu cần. Làm cho các tập lệnh thực thi được. Hãy chắc chắn rằng "~/.local/bin" nằm trong biến môi trường PATH của bạn TRƯỚC KHI "/ usr/bin". Nếu đúng như vậy, thì khi makefile gọi trình biên dịch (giả sử chúng sử dụng các đường dẫn tương đối), các kịch bản lệnh của bạn sẽ được gọi ra, thay vào đó.

+1

Sử dụng "$ @" (có dấu ngoặc kép) để đảm bảo không gian trong arg được xử lý đúng cách. – coppit

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