我正在尝试链接到OS X上的静态库.我-static
在gcc命令中使用了该标志,但是我收到以下错误消息:
ld_classic: can't locate file for: -lcrt0.o collect2: ld returned 1 exit status
我查看了手册页,它的内容如下:
除非所有库(包括libgcc.a)都已使用-static编译,否则此选项在Mac OS X上不起作用.由于既没有提供libSystem.dylib的静态版本也没有提供crt0.o,因此该选项对大多数人没用.
有没有其他方法可以链接到这个静态库?
要链接到存档库(有时也称为静态库),只需将其添加到链接行:
gcc main.o ... -lfoo ...
链接器将搜索libfoo.dylib,然后搜索libfoo.a,这就是您所需要的.
如果您同时拥有该库的两个版本,并希望链接存档版本而不是动态版本,则只需在链接行上指定存档的完整路径:
gcc main.o ... /path/to/libfoo.a ...
遗憾的是,它不受支持.有人报告说可以手动编译crt0,但没有人确认.
一个常见的情况是在动态链接系统框架和库时对第三个用户库进行静态链接,因此您的用户在使用程序之前无需安装第三方库.如果磁带库对框架动态链接(这是常有的情况下),它可能仍然具有静态.一船,但它是不够的只是更换-l
用/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)
另外,请阅读要链接的库的许可证.
-Bstatic
似乎是OS-X Lion上的无操作 - 用于gcc -v
证实这一点.