我正在尝试链接到OS X上的静态库。我在gcc命令中使用了-static
标志,但是收到以下错误消息:
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,因此该选项对大多数人没用。
还有另一种方法可以链接到这个静态库吗?
答案 0 :(得分:53)
要链接到存档库(有时也称为静态库),只需将其添加到链接行:
gcc main.o ... -lfoo ...
链接器将搜索libfoo.dylib,然后搜索libfoo.a,这就是你所需要的。
如果你有两个版本的库,并希望链接存档版本而不是动态版本,只需在链接行指定存档的完整路径:
gcc main.o ... /path/to/libfoo.a ...
答案 1 :(得分:13)
遗憾的是,it's not supported。有些人报告说可以手动编译crt0但nobody confirms it。
答案 2 :(得分:10)
一个常见的情况是针对第三个用户库的静态链接,同时动态链接系统框架和库,因此您的用户在使用您的程序之前不需要安装第三方库。如果库是动态地链接到框架(通常是这种情况),它仍然可以附带静态.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)
另外,请阅读您要链接的库的许可证。
答案 3 :(得分:7)
-Bstatic
似乎是OS-X Lion的无操作 - 使用gcc -v
来确认这一点。
答案 4 :(得分:0)
我遇到了同样的问题。以下是一个解决方法的示例:
第1步:创建文件
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" );
}
和myfunc.c:
#include <stdio.h>
void myfunc1( void );
void myfunc2( void );
int main() {
myfunc1();
myfunc2();
return 0;
}
第2步:创建lib
gcc -c myfunc1.c myfunc2.c
ar -r libmyfuncs.a myfunc1.o myfunc2.o
第3步:链接
gcc -o myfunc -L. myfunc.c -lmyfuncs
不要忘记键入&#34; -L。&#34 ;; dot表示当前路径。
希望有所帮助。