创建静态Mac OS X构建

时间:2011-03-10 11:51:43

标签: c macos gcc static

如何在Mac OS X上创建.c文件的静态版本?当我尝试:

gcc -o test Main.c -static

我明白了:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

3 个答案:

答案 0 :(得分:27)

Mac OS X的gcc:

不支持

http://discussions.apple.com/message.jspa?messageID=11053384

  

也许“-static”标志在MacOS X上不起作用。并非所有gcc功能都在MacOS X上实现。在未来版本的操作系统中,Apple甚至不会使用gcc。

     

我不知道如何使用“-static”进行链接。我想不出任何理由在MacOSX上这样做。如果我知道你为什么要使用“-static”,我可能会对这个问题更感兴趣。现在,我只是不明白。通过寻求帮助,您实际上是要求项目的合作者 - 即使只有10分钟。你需要让我感兴趣。

http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html

  

Mac OS X不支持用户二进制文件的静态链接。将用户二进制文件绑定到Mac OS X库和接口的内部实现会限制我们更新和增强Mac OS X的能力。相反,支持动态链接(链接)自动反对crt1.o而不是查找crt0.o,例如)。

     

我们强烈建议您仔细考虑静态链接的限制,并考虑您的客户及其需求,以及您需要提供的长期支持。

更新:禁止是静态二进制文件。但你仍然可以编译一些静态库并与你一起使用另一个程序。程序将与您的库静态链接,但libc等其他库将是动态的,因此程序将是动态可执行文件。

答案 1 :(得分:15)

无法在OSX下构建没有动态加载库的二进制文件。我尝试了苹果llvm-gcc和macports gcc。然而到目前为止没有回答的是这不是必需的。您可以静态链接c / c ++库(并与一些动态部分一起使用)。

文件hello.cpp:

#include <iostream>
using namespace std; 
int main()
{
    cout << "Hello World!";
}

像往常一样编译:

g++ hello.cpp -o hello

检查链接:

otool -L hello
hello:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

我们无法摆脱libSystem.B.dylib依赖,但使用macports gcc,我们可以这样做:

g++-mp-4.6 -static-libgcc -static-libstdc++ hello.cpp -o hello

otool -L hello
hello:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

显然,Apple不支持静态链接:

llvm-g++ -static-libgcc -static-libstdc++ hello.cpp -o hello

otool -L hello
hello:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

答案 2 :(得分:6)

想象一下,您想将某些功能转换为库。

文件:example.c

#include <stdio.h>

void aFunction( int a )
{
    printf( "%d\n", a );
}

文件:example.h

void aFunction( int a );

文件:main.c

#include "example.h"

int main( ) 
{
    aFunction( 3 );

    return 0;
}

创建库:

gcc -c example.c
ar -r libmylibrary.a  example.o

链接库:

gcc main.c -lmylibrary -L. -I.

然后文件example.c是整个程序的静态构建。