Dan*_*iel 31 c macos static gcc
如何在Mac OS X上创建.c文件的静态版本?当我尝试:
gcc -o test Main.c -static
Run Code Online (Sandbox Code Playgroud)
我明白了:
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
osg*_*sgx 29
Mac OS X的gcc不支持它:
http://discussions.apple.com/message.jspa?messageID=11053384
也许那个"静止"的标志在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等其他库将是动态的,因此程序将是动态可执行文件.
gba*_*ler 16
没有动态加载库的二进制文件无法在OSX下构建.我尝试了苹果llvm-gcc和macports gcc.然而到目前为止没有回答的是这不是必需的.您可以静态链接c/c ++库(并与一些动态部分一起使用).
文件hello.cpp:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!";
}
Run Code Online (Sandbox Code Playgroud)
像往常一样编译:
g++ hello.cpp -o hello
Run Code Online (Sandbox Code Playgroud)
检查链接:
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)
Run Code Online (Sandbox Code Playgroud)
我们无法摆脱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)
Run Code Online (Sandbox Code Playgroud)
显然只是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)
Run Code Online (Sandbox Code Playgroud)
想象一下,您想将某些功能转换为库.
文件:example.c
#include <stdio.h>
void aFunction( int a )
{
printf( "%d\n", a );
}
Run Code Online (Sandbox Code Playgroud)
文件:example.h
void aFunction( int a );
Run Code Online (Sandbox Code Playgroud)
文件:main.c
#include "example.h"
int main( )
{
aFunction( 3 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
要创建库:
gcc -c example.c
ar -r libmylibrary.a example.o
Run Code Online (Sandbox Code Playgroud)
要链接库:
gcc main.c -lmylibrary -L. -I.
Run Code Online (Sandbox Code Playgroud)
然后文件example.c是整个程序的静态构建.
| 归档时间: |
|
| 查看次数: |
28820 次 |
| 最近记录: |