如何在OS X上进行静态链接

时间:2009-05-10 06:22:10

标签: macos linker static-libraries

我正在尝试链接到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,因此该选项对大多数人没用。

还有另一种方法可以链接到这个静态库吗?

5 个答案:

答案 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表示当前路径。

希望有所帮助。