2014-02-28 31 views
2

當我嘗試編譯兩個不同的程序時,我遇到了似乎是同樣的問題。他們每個人首先創建一個靜態庫,然後創建鏈接該庫的主應用程序。我正在使用gcc 4.7.2在Mac OS Mavericks上工作。針對存檔構建的不是被鏈接的體系結構的靜態庫(x86_64)

計劃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

我遇到了不同的程序,做同樣的同樣的問題:第一,創建庫稍後使用它。

這是創建的lib當輸出:

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 

發生了什麼事?

回答

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 

之後,如果我看靜態庫的內容,我看到的是,除了這些文件,也有一些奇怪的directorios:

$ 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 

我不明白其中的道理可言,但它爲我工作。

0

我得到錯誤的架構錯誤消息的問題。它說以下內容:

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

脂給出:非FAT文件:../lib/blahblah.a是架構:x86_64的

在makefile它說以下內容: ARCH_FLAG = -arch x86_64的-arch i386

我註釋掉了i386零件,錯誤消失了。 ARCH_FLAG = -arch x86_64#-arch i386

所以,我認爲你可能出於同樣的原因得到錯誤。也許你只需要設置架構類來匹配你的庫。

順便說一句,我的makefile是由swig生成的,而且我沒有爲編譯器設置任何開關。

2

一個可能的原因是使用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

cd /usr/local/bin 
mv ar gar 
ln -s /usr/bin/ar ar 
mv ranlib granlib 
ln -s /usr/bin/ranlib ranlib 
:如果你和我一樣,有 /usr/local/bin/usr/bin前述 /usr/bin$PATH,與GNU工具 /usr/local/bin和Xcode中的人,你可以用它修復
相關問題