一个常见的情况是静态链接到第三方用户库,同时动态链接到系统框架和库,因此您的用户在使用您的程序之前不需要安装第三方库。如果库是针对框架动态链接的(通常是这种情况),它可能仍带有静态 .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)
另外,请阅读您要链接到的库的许可证。