我正在使用脚本使用Xcode 4.3构建GraphViz当前版本(2012年6月7日)时发现库未找到错误。对于Xcode4.3的新位置以及Applications文件夹中的开发人员工具,从其他人的成功食谱中更新构建脚本时,我可能会犯错。
ld: library not found for -lcrt1.10.6.o
(从内存中执行此操作,因此CRT库上的确切数字可能是错误的)

我也将如何将其合并到IDE中的Xcode构建中也感到有些困惑。我是一个非常有经验的程序员,但是有时无法找到绕过Xcode 4的方式。 (数十年来的Visual Studio等)。

我已经复制了this earlier question中的说明并进行了改编

#!/bin/sh
# For iPhoneOS, see http://clang.llvm.org/ for options
export DEV_iOS=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
# was /Developer/Platforms/iPhoneOS.platform/Developer
export SDK_iOS=${DEV_iOS}/SDKs/iPhoneOS5.1.sdk
export COMPILER_iOS=${DEV_iOS}/usr/bin
export CC=${COMPILER_iOS}/clang
export CXX=${COMPILER_iOS}/clang++
export LDFLAGS="-arch armv7 -pipe -Os -gdwarf-2 -mthumb -isysroot ${SDK_iOS}"
export CFLAGS="${LDFLAGS}"
export OBJCFLAGS="${LDFLAGS}"
export CXXFLAGS="${LDFLAGS} -fvisibility-inlines-hidden"
export LD=${COMPILER_iOS}/ld
export CPP=${COMPILER_iOS}/clang
export AR=${COMPILER_iOS}/ar
export AS=${COMPILER_iOS}/as
export NM=${COMPILER_iOS}/nm
export CXXCPP="${COMPILER_iOS}/clang++"
export OBJC=${COMPILER_iOS}/clang
export RANLIB=${COMPILER_iOS}/ranlib

./configure \
--build=arm-apple-darwin11 \
--host=arm-apple-darwin11 \
--disable-dependency-tracking \
--enable-shared=no \
--enable-static=yes \
--enable-ltdl=no \
--enable-swig=no \
--enable-tcl=no \
--srcdir=${GVROOT} \
--with-codegens=no \
--with-cgraph=no \
--with-graph=yes \
--with-expat=no \
--with-fontconfig=no \
--with-freetype2=no \
--with-ipsepcola=yes \
--with-libgd=no \
--with-quartz=yes \
--with-visio=yes \
--with-x=no

最佳答案

编译器通常使用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
    

    如您所见,MacOSX10.5缺少crt1.10.6.o。

    解决方案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
    export C_INCLUDE_PATH=/Developer/SDKs/MacOSX10.5.sdk/usr/include
    export LIBRARY_PATH=/Developer/SDKs/MacOSX10.5.sdk/usr/lib
    

    如果可行,则可以将上述几行添加到 shell 配置文件(〜/.profile)中,以使更改永久生效。

    如何测试

    使用以下代码创建示例conftest.c文件:
    #ifdef __GNUC__
      yes;
    #endif
    

    并尝试通过以下方式进行编译:
    gcc conftest.c
    cc conftest.c
    cc conftest.cc conftest.c
    

    故障排除

    要查看到底丢失了哪个文件,请尝试使用dtruss对其进行调试,例如:
    sudo dtruss -f gcc conftest.c 2>/dev/stdout | grep crt
    

    您应该看到类似以下内容的内容:
    12426/0xb4e3b:  stat64("/Developer/usr/lib/gcc/i686-apple-darwin10/4.2.1/crt1.10.6.o\0", 0x7FFF5FBFE780, 0xB)        = -1 Err#2
    

    因此,一旦找到丢失的文件,则可以通过从现有位置(例如locate crt1.10.6.o)链接丢失的文件来遵循第一个解决方案。如果您还有其他缺失的符号,请尝试其他文件(请通过file `locate crt1.10.6.o`之前检查体系结构)。

    例如。
    sudo ln -s /Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/lib/crt1.10.6.o /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/crt1.10.6.o
    sudo ln -s /Applications/Xcode.app/Contents/Developer//Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/lib/crt1.10.6.o /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/x86_64/crt1.10.6.o
    

    相关的

    Error in xcode project: ld: library not found for -lcrt1.10.6.o

    关于ios5 - 命令行库构建因链接器错误而失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10941247/

    10-09 07:18