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.
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