一个常见的情况是静态链接到第三方用户库,同时动态链接到系统框架和库,因此您的用户在使用您的程序之前不需要安装第三方库。如果库是针对框架动态链接的(通常是这种情况),它可能仍附带静态 .a,但仅将 -l<libname> 替换为 /path/to/libname.a 是不够的,因为 .a 将没有依赖项在里面。您还必须动态链接到您的库正在使用的那些框架。
例如,假设您想编写一个使用开源 libusb 的程序,而无需您的用户下载和安装 libusb。假设您有一个使用此构建的动态链接二进制文件:
clang -lusb-1.0 main.c -o myprogram
要在 OS X 上静态链接,命令如下所示(注意 -framework 参数):
clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram
要查找需要添加哪些系统框架和库,使用otool查看第三方dylib:
otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib
其中显示:
/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)
您可以从添加框架开始,然后一次添加一个库,您将看到未定义的引用错误列表缩小。请注意,您可能不需要添加每个库,因为有些库可能会作为您明确添加的库的依赖项加载。
如果您不确定 dylib 存在于何处,请使用原始动态方式(使用 -lusb-1.0)构建您的程序,然后在其上运行 otool:
clang -lusb-1.0 main.c -o myprogram
otool -L myprogram
给出:
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)
另外,请阅读您要链接到的库的许可证。