如何在OS X上静态链接

我试图链接到OS X上的静态库。我在gcc命令中使用了-static标志,但是我收到以下错误消息:

 ld_classic:找不到文件:-lcrt0.o
 collect2:ld返回1退出状态

我查看了man页面,内容如下:

除非所有库(包括libgcc.a)都已经使用-static编译,否则此选项在Mac OS X上将不起作用。 由于既没有提供静态版本的libSystem.dylib也没有提供crt0.o,所以这个选项对大多数人没有用处。

有没有另一种方法链接到这个静态库?

为了链接到一个档案库(有时也称为静态库),只需将其添加到链接线:

 gcc main.o ... -lfoo ... 

链接器将searchlibfoo.dylib,然后searchlibfoo.a,这就是您所需要的。

如果您有两个版本的磁带库,并且希望链接归档版本而不是dynamic版本,则只需在链接行中指定归档文件的完整path即可:

 gcc main.o ... /path/to/libfoo.a ... 

遗憾的是, 它不被支持 。 有人报告说可以手动编译crt0,但没有人确认 。

-Bstatic似乎是OS-X Lion上没有的操作 – 使用gcc -v来确认这一点。

一个常见的情况是静态链接到第三个用户库,同时dynamic链接到系统框架和库,因此用户在使用程序之前不需要安装第三方库。 如果库是dynamic链接到框架(通常情况下),它仍然可以运行静态.a,但仅仅用-l<libname> /path/to/libname.a -l<libname>replace-l<libname>是不够的,因为.a不会有依赖关系。 您还必须dynamic链接到您的图书馆正在使用的框架。

例如,假设你想编写一个使用开源libusb的程序,而不需要你的用户下载和安装libusb。 假设你有一个dynamic链接的二进制文件,

 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 

要find需要添加的系统框架和库,使用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的存在位置,请使用原始dynamic方式(使用-lusb-1.0)构build程序,然后在其上运行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) 

另外,请阅读您链接到的库的许可证。

我遇到了同样的问题。 这是一个解决问题的例子:

STEP1:创build文件

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; } 

STEP2:创build这个lib

 gcc -c myfunc1.c myfunc2.c ar -r libmyfuncs.a myfunc1.o myfunc2.o 

STEP3:链接

 gcc -o myfunc -L. myfunc.c -lmyfuncs 

不要忘记input“-L”。 点表示当前path。

希望有所帮助。