58

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

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

我查看了手册页,内容如下:

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

还有其他方法可以链接到这个静态库吗?

4

5 回答 5

54

为了链接到存档库(有时也称为静态库),只需将其添加到链接行:

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

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

如果您同时拥有两个版本的库,并且想要链接存档版本而不是动态版本,只需在链接行上指定存档的完整路径:

gcc main.o ... /path/to/libfoo.a ...
于 2009-05-10T21:54:10.717 回答
19

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

于 2009-12-04T16:33:11.900 回答
18

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

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

于 2017-01-06T21:39:44.043 回答
9

-Bstatic似乎在 OS-X Lion 上没有任何操作 - 用于gcc -v确认这一点。

于 2012-08-07T19:39:30.623 回答
1

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

STEP1:创建文件

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:创建库

gcc -c myfunc1.c myfunc2.c

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

STEP3:链接

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

不要忘记输入“-L.”;点表示当前路径。

希望有帮助。

于 2017-06-11T15:21:23.553 回答