【问题标题】:Static library built for archive which is not the architecture being linked (x86_64)为存档构建的静态库,它不是被链接的体系结构 (x86_64)
【发布时间】:2014-02-28 23:16:01
【问题描述】:

当我尝试编译两个不同的程序时,我遇到了似乎相同的问题。他们每个人都首先创建一个静态库,然后是链接该库的主应用程序。我正在使用 gcc 4.7.2 开发 Mac OS Mavericks。

计划 1

这就是我运行 make 时发生的情况:

首先,库libfeat.a 已创建,但我收到警告:

ar rc ../lib/libfeat.a imgfeatures.o utils.o sift.o kdtree.o minpq.o xform.o
ranlib  ../lib/libfeat.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: warning for library: ../lib/libfeat.a the table of contents is empty (no object file members in the library define global symbols)

然后,在编译应用程序时,它说它不能使用该库,因为它不是为相同的架构 (x86_64) 构建的:

gcc -O3 -I../include `pkg-config --cflags opencv` `pkg-config --cflags gtk+-3.0` `pkg-config --cflags gsl` siftfeat.c -o ../bin/siftfeat -L../lib -lfeat `pkg-config --libs opencv` `pkg-config --libs gtk+-3.0` `pkg-config --libs gsl`
ld: warning: ignoring file ../lib/libfeat.a, file was built for archive which is not the architecture being linked (x86_64): ../lib/libfeat.a

如果我运行lipo,我会得到:

$ lipo -info ../lib/libfeat.a 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: archive with no architecture specification: ../lib/libfeat.a (can't determine architecture for it)

方案 2

我在使用另一个执行相同操作的程序时遇到了同样的问题:首先创建一个库,然后再使用它。

这是创建库时的输出:

ar crv libsba.v1.5.a sba_levmar.o sba_levmar_wrap.o sba_lapack.o sba_crsm.o sba_chkjac.o
r - sba_levmar.o
r - sba_levmar_wrap.o
r - sba_lapack.o
r - sba_crsm.o
r - sba_chkjac.o
ranlib libsba.v1.5.a

这是应用程序:

c++ -o bundler -O3 -Wall -fpermissive  -I../lib/imagelib -I../lib/sfm-driver -I../lib/matrix -I../lib/5point -I../lib/sba-1.5 -I../lib/ann_1.1_char/include  -L../lib -L../lib/ann_1.1_char/lib \
    -D__NO_UI__ -D__BUNDLER__ -D__BUNDLER_DISTR__ BaseApp.o BundlerApp.o keys.o Register.o Epipolar.o Bundle.o BundleFast.o MatchTracks.o Camera.o Geometry.o ImageData.o SifterUtil.o BaseGeometry.o BundlerGeometry.o BoundingBox.o BundleAdd.o ComputeTracks.o BruteForceSearch.o BundleIO.o ProcessBundle.o BundleTwo.o Decompose.o RelativePose.o Distortion.o TwoFrameModel.o LoadJPEG.o -limage -lsfmdrv -lsba.v1.5 -lmatrix -lz -llapack -lblas -lcblas -lminpack -lm -l5point -ljpeg -lANN_char -lgfortran
ld: warning: ld: warning: ignoring file ../lib/libsba.v1.5.a, file was built for archive which is not the architecture being linked (x86_64)

在这种情况下,lipo 确实告诉我该库的架构是 x86_64:

$ lipo -info lib/libsba.v1.5.a 
input file lib/libsba.v1.5.a is not a fat file
Non-fat file: lib/libsba.v1.5.a is architecture: x86_64

发生了什么事?

【问题讨论】:

    标签: c++ macos static-libraries unix-ar


    【解决方案1】:

    一个可能的原因是使用 GNU ar(1)/ranlib(1) 而不是 Xcode 工具链提供的。运行which -a arwhich -a ranlib 以查看$PATH 中的内容。

    例如:

    $ which -a ranlib
    /usr/local/bin/ranlib
    /usr/bin/ranlib
    
    $ /usr/local/bin/ranlib --version
    GNU ranlib (GNU Binutils) 2.28.51.20170105
    Copyright (C) 2017 Free Software Foundation, Inc.
    This program is free software; you may redistribute it under the terms of
    the GNU General Public License version 3 or (at your option) any later version.
    This program has absolutely no warranty.
    
    $ /usr/bin/ralib --version
    error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: unknown option character `-' in: --version
    Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib [-sactfqLT] [-] archive [...]
    

    ar 也是如此。如果你和我一样,在$PATH 中有/usr/local/bin/usr/bin 之前,在/usr/local/bin 中使用GNU 工具,在/usr/bin 中使用Xcode 工具,你可以通过以下方式修复它:

    cd /usr/local/bin
    mv ar gar
    ln -s /usr/bin/ar ar
    mv ranlib granlib
    ln -s /usr/bin/ranlib ranlib
    

    【讨论】:

    • 谢谢!你也可以只做brew unlink binutils
    • 这非常令人恼火,我不明白为什么会这样。你碰巧知道吗?显然ar 的两个版本产生不同的档案,但为什么/如何?事实上,GNU ar 似乎不会产生符号索引,即使使用 -s 调用也是如此,而 GNU ranlib 也不会添加它。
    • @KonradRudolph 我不知道。也许与马赫有关?如果您找出原因,这将是一个受欢迎的答案。
    • @Timmmm,上帝保佑你,伙计!你拯救了我的一周!
    • 如果您仍然需要 binutils,您可以更改 env 路径:export PATH="$PATH:/usr/local/opt/binutils/bin"。注意 $PATH 必须在 binutils 路径之前。
    【解决方案2】:

    感谢this question with the same problem,我可以调查这个问题。我对静态库没有太多经验,但我会尝试解释这个问题。

    出于某种原因,Mac OSX ar 实用程序在静态库中创建了“子目录”。比如构建sba库,make从目标文件构建静态库的步骤是:

    ar crv libsba.v1.5.a sba_levmar.o sba_levmar_wrap.o sba_lapack.o sba_crsm.o sba_chkjac.o
    

    之后再看静态库的内容,发现除了文件之外,还有一些奇怪的directories:

    $ ar -t libsba.v1.5.a 
    __.SYMDEF
    /
    //
    sba_levmar.o/
    /0
    sba_lapack.o/
    sba_crsm.o/
    sba_chkjac.o/
    sba_levmar.o
    sba_levmar_wrap.o
    sba_lapack.o
    sba_crsm.o
    sba_chkjac.o
    sba_levmar.o
    sba_levmar_wrap.o
    sba_lapack.o
    sba_crsm.o
    sba_chkjac.o
    

    如果我们尝试提取这些文件,我们会收到一些关于子目录的错误:

    $ ar -x libsba.v1.5.a 
    ar: /: Is a directory
    ar: //: Is a directory
    ar: sba_levmar.o/: Not a directory
    ar: /0: Permission denied
    ar: sba_lapack.o/: Not a directory
    ar: sba_crsm.o/: Not a directory
    ar: sba_chkjac.o/: Not a directory
    

    现在,如果我们使用提取的目标文件再次创建 lib,它将起作用:

    $ ar crv libsba.v1.5.a lib_o/*.o
    a - lib_o/sba_chkjac.o
    a - lib_o/sba_crsm.o
    a - lib_o/sba_lapack.o
    a - lib_o/sba_levmar.o
    a - lib_o/sba_levmar_wrap.o
    
    $ ar -t libsba.v1.5.a
    __.SYMDEF SORTED
    sba_chkjac.o
    sba_crsm.o
    sba_lapack.o
    sba_levmar.o
    sba_levmar_wrap.o
    

    我完全不明白原因,但它对我有用。

    【讨论】:

      【解决方案3】:

      使用libtool -static -a 可能更容易获得工作静态库。

      Static library link issue with Mac OS X: symbol(s) not found for architecture x86_64

      【讨论】:

        【解决方案4】:

        如果您安装了binutils,只需取消链接或卸载它

        brew unlink binutils
        

        【讨论】:

        • mac,并尝试制作grpc_php_plugin。谢谢你拯救了我的一天。
        【解决方案5】:

        我遇到了收到错误架构错误消息的问题。上面写着:

         ld: warning: ignoring file blah/lib/blahblah.a, file was built for archive which is not the architecture being linked (i386)
        

        lipo 给出:非胖文件:../lib/blahblah.a 是架构:x86_64

        在makefile中它说: ARCH_FLAG = -arch x86_64 -arch i386

        我注释掉了 i386 部分,错误消失了。 ARCH_FLAG = -arch x86_64 #-arch i386

        所以,我认为您可能会因为同样的原因而收到错误消息。也许您只需要设置架构类以匹配您的库。

        顺便说一句,我的makefile是swig生成的,我没有为编译器设置任何开关。

        【讨论】:

          猜你喜欢
          • 2012-06-03
          • 1970-01-01
          • 1970-01-01
          • 2011-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-19
          • 1970-01-01
          相关资源
          最近更新 更多