2013-04-27 32 views
7

Tôi có một số mã mà tôi muốn chạy trên một máy mà tôi không có quyền truy cập root. Máy đó không có một số thư viện cần thiết để chạy mã này.C - Biên dịch với các phụ thuộc bao gồm

Có cách nào để bao gồm tất cả các phụ thuộc khi tôi biên dịch không? Tôi nhận ra tập tin kết quả có thể khá lớn.

Trả lời

7

Điều bạn đang tìm kiếm là biên dịch tĩnh. Thực hiện biên soạn tĩnh bao gồm tất cả các thư viện vào thực thi chính nó, vì vậy bạn không cần phải lo lắng nhiều về chuỗi sự phụ thuộc vào một hệ thống cụ thể, phân phối, vv

Bạn có thể làm điều này với:

gcc -Wl,-Bstatic -llib1 -llib2 file.c 

-Wl chuyển các cờ theo sau đến trình liên kết, -Bstatic yêu cầu nó liên kết tĩnh nếu có thể, và sau đó là lib1, lib2, là các lib bạn định liên kết.

Ngoài ra, hãy thử:

gcc -static-libgcc -static file.c 

Việc lập vẫn sẽ cần phải phù hợp với kiến ​​trúc của hệ thống không có đặc quyền. Và bạn cần phải có các thư viện tĩnh được cài đặt trên hệ thống biên dịch (lib.a)

Nếu biên soạn đúng cách, nó sẽ hiển thị "không phải là một động thực thi" khi bạn chạy:

ldd a.out 
+0

Cảm ơn. Sẽ xác nhận sau khi tôi đã kiểm tra nó nhưng tôi nghĩ rằng đó là chính xác những gì tôi đã sau! – Hector

+0

Ok, Bây giờ tôi nhận được điều này có vẻ lạ /usr/bin/ld: không thể tìm thấy -lgcc_s Tất cả những gì tôi đã thêm là những gì bạn đề xuất với -openssl sau – Hector

+0

Thêm các cờ này: '-static-libgcc' và' -static-libstdC++ '(nếu sử dụng C++) –