Я испытываю то, что, похоже, та же проблема, когда я пытаюсь скомпилировать две разные программы. Каждый из них создает сначала статическую библиотеку, а затем основное приложение, связывающее эту библиотеку. Я работаю над Mac OS Mavericks с gcc 4.7.2.
Программа 1
Это то, что происходит, когда я запускаю make
:
Сначала libfeat.a
библиотека 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
Что происходит?