2009-05-10 9 views
41

Tôi đang cố gắng để liên kết đến một thư viện tĩnh trên OS X. tôi đã sử dụng -static cờ trong lệnh gcc nhưng tôi nhận được thông báo lỗi sau:Làm thế nào để tĩnh liên kết trên OS X

 
ld_classic: can't locate file for: -lcrt0.o 
collect2: ld returned 1 exit status 

Tôi nhìn trong các trang của người đàn ông và nó đọc một cái gì đó như:

Tùy chọn này sẽ không hoạt động trên Mac OS X trừ khi tất cả thư viện (bao gồm libgcc.a) cũng đã được biên dịch bằng -static. Vì không có phiên bản tĩnh của libSystem.dylib và crt0.o được cung cấp, tùy chọn này không hữu ích cho hầu hết mọi người.

Có cách nào khác để liên kết đến thư viện tĩnh này không?

+1

Tài liệu Apple ngu ngốc đề xuất liên kết động, nhưng chúng không hiển thị bất kỳ lệnh 'ld' nào thực sự thực hiện điều này. – mcandre

Trả lời

53

Để liên kết đến một thư viện lưu trữ (đôi khi còn được gọi là thư viện tĩnh), chỉ cần thêm nó vào dòng liên kết:

gcc main.o ... -lfoo ... 

Các mối liên kết sẽ tìm kiếm libfoo.dylib, và sau đó libfoo.a, đó là tất cả những gì bạn cần.

Nếu bạn có cả phiên bản của thư viện, và muốn liên kết với một phiên bản lưu trữ trong sở thích của một năng động, chỉ cần chỉ định đường dẫn đầy đủ vào kho lưu trữ trên dòng liên kết:

gcc main.o ... /path/to/libfoo.a ... 
+8

Không có crt0.o hoặc crt0.a hoặc bất kỳ thứ gì tương tự trên OS X và XCode. – alecco

+0

@alecco Bạn * có thể * nhận 'crt0.o' thông qua [' Csu'] (https://opensource.apple.com/tarballs/Csu/) (viết tắt của "C khởi động"), nhưng tiếc là 'crt0 .o' không thể liên kết với 'libc' vì không có phiên bản tĩnh của' libSystem.dylib'. Có thêm chi tiết về vấn đề này trên [Github ticket] (https://github.com/skaht/Csu-85/issues/2) cho 'Csu'. – GDP2

12

Rất tiếc, it's not supported. Một số người báo cáo có thể biên dịch theo cách thủ công crt0 nhưng nobody confirms it.

+3

Có vẻ như tác phẩm '-Bstatic'. – Galaxy

+0

Bạn * có thể * biên dịch 'crt0.o' qua [' Csu'] (https://opensource.apple.com/tarballs/Csu/) (viết tắt của "C khởi động"), nhưng tiếc là 'crt0.o 'không thể liên kết với' libc' vì không có phiên bản tĩnh của 'libSystem.dylib'. Vì vậy, yeah, nó không được hỗ trợ cho đến khi Apple cung cấp cho chúng ta một phiên bản tĩnh của 'libSystem.dylib'. Hoặc là hoặc không sử dụng 'libc'. Có thêm chi tiết về [Github ticket] này (https://github.com/skaht/Csu-85/issues/2) cho 'Csu'. – GDP2

7

-Bstatic có vẻ là một no-op trên OS-X Lion - được sử dụng gcc -v để xác nhận điều này.

5

Trường hợp thông thường là liên kết tĩnh đối với thư viện người dùng thứ ba trong khi liên kết động với khung hệ thống và thư viện, để người dùng của bạn không cần phải cài đặt libs của bên thứ ba trước khi sử dụng chương trình của bạn. Nếu thư viện được liên kết động với các khung công tác (như thường là trường hợp), nó vẫn có thể được gửi đi bằng tĩnh .a, nhưng không đủ để thay thế -l<libname> bằng /path/to/libname.a vì .a sẽ không có phụ thuộc trong đó. Bạn cũng sẽ phải liên kết động với các khuôn khổ mà thư viện của bạn đang sử dụng.

Ví dụ: giả sử bạn muốn viết chương trình sử dụng libusb nguồn mở mà không yêu cầu người dùng tải xuống và cài đặt libusb. Giả sử bạn có một nhị phân tự động liên kết bạn xây dựng với điều này:

clang -lusb-1.0 main.c -o myprogram 

Để tĩnh liên kết trên OS X, lệnh trông như thế này (chú ý -framework arguments):

clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram 

Để tìm các khuôn khổ những gì hệ thống và các thư viện bạn cần phải thêm, nhìn vào dylib bên thứ ba sử dụng otool:

otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib 

trong đó cho thấy:

01.
/usr/local/opt/libusb/lib/libusb-1.0.0.dylib: 
    /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) 
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 

Bạn có thể bắt đầu bằng cách thêm các khuôn khổ, theo sau là từng thư viện và bạn sẽ thấy danh sách các lỗi tham chiếu không xác định thu nhỏ.Lưu ý rằng có thể bạn sẽ không cần phải thêm mọi thư viện, vì một số có thể được tải dưới dạng phụ thuộc cho những thư bạn đã thêm một cách rõ ràng.

Nếu bạn không chắc chắn nơi dylib tồn tại, xây dựng chương trình của bạn theo cách năng động ban đầu (với -lusb-1.0), và chạy otool vào nó:

clang -lusb-1.0 main.c -o myprogram 
otool -L myprogram 

mang đến cho:

myprogram: 
    /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 

Ngoài ra, hãy đọc giấy phép của thư viện bạn đang liên kết đến.

0

Tôi đã gặp sự cố tương tự. Dưới đây là một ví dụ để làm việc xung quanh:

STEP1: tạo file

myfunc1.c:

#include <stdio.h> 

void myfunc1() { 
    printf("This is my func1!\n"); 
} 

myfunc2.c:

#include <stdio.h> 

void myfunc2() { 
    printf("This is my func2!\n"); 
} 

và myfunc.c:

#include <stdio.h> 

void myfunc1(void); 
void myfunc2(void); 

int main() { 
    myfunc1(); 
    myfunc2(); 
    return 0; 
} 

STEP2: tạo lib

gcc -c myfunc1.c myfunc2.c 

ar -r libmyfuncs.a myfunc1.o myfunc2.o 

STEP3: link

gcc -o myfunc -L. myfunc.c -lmyfuncs 

Đừng quên gõ; "-L." dấu chấm cho biết đường dẫn hiện tại.

Hy vọng điều đó sẽ hữu ích.