编译器通常使用crt1.o结合crt[i/n].o和crt[begin/end].o来支持构造函数和析构函数(在main和exit之前和之后调用的函数)。
此错误可能是由于缺少特定部署目标的库文件造成的。
首先,做一些调查,比如:
-
列出所有部署目标:
ls -la /Developer/SDKs
-
查找您在哪个环境中拥有哪些crt1 库
find /Developer/SDKs -name crt1\*
你可以看到类似的东西:
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/crt1.10.5.o
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/crt1.o
/Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.10.5.o
/Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.10.6.o
/Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.o
正如您在上面的示例中看到的,crt1.10.6.o 在 MacOSX10.5 中缺失。
解决方案 1
您可以通过创建指向其他环境的丢失文件的链接来解决此问题,或者您可以更改部署目标。
例如
ln -s /Developer/SDKs/MacOSX10.6.sdk/usr/lib/crt1.10.6.o /Developer/SDKs/MacOSX10.5.sdk/usr/lib/
它丢失的其他原因是您的系统中可能安装了不同的gcc。例如:
which gcc
xcrun -find gcc
brew list | grep gcc; brew list gcc47
解决方案 2
因此,当您使用 make 进行编译时,您实际上可以通过 CC 变量指定正确的编译器。例如
CC=/path/to/gcc-3.4 make
解决方案 3
您还可以尝试为 gcc 指定正确的目标部署环境变量,例如:
export MACOSX_DEPLOYMENT_TARGET=10.5
如果可行,那么您可以将此库路径添加到您的 shell 配置文件 (~/.profile)。
例如
export C_INCLUDE_PATH=/Developer/SDKs/MacOSX10.5.sdk/usr/include
export LIBRARY_PATH=/Developer/SDKs/MacOSX10.5.sdk/usr/lib
或者通过临时导出它们。
如何测试
使用以下代码创建示例 conftest.c 文件:
#ifdef __GNUC__
yes;
#endif
并尝试通过以下方式编译它:
gcc conftest.c
cc conftest.c
cc conftest.cc conftest.c