Я испытываю одну и ту же проблему, когда пытаюсь скомпилировать две разные программы. Каждый из них создает сначала статическую библиотеку, а затем основное приложение, связывающее эту библиотеку. Я работаю на Mac OS Mavericks с gcc 4.7.2.
Программа 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
В чем дело?
Возможная причина — использование GNU ar(1)
/ranlib(1)
вместо тех, которые поставляются с цепочкой инструментов Xcode. Бежать which -a ar
а также which -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
, Если ты как я и имел /usr/local/bin
предшествующего /usr/bin
в $PATH
, с инструментами GNU в /usr/local/bin
и Xcode в /usr/bin
Вы можете исправить это с помощью:
cd /usr/local/bin
mv ar gar
ln -s /usr/bin/ar ar
mv ranlib granlib
ln -s /usr/bin/ranlib ranlib
С помощью libtool -static -a
может быть проще получить работающую статическую библиотеку.
Проблема со статической библиотекой в Mac OS X: символы не найдены для архитектуры x86_64
Благодаря этот вопрос с той же проблемой, Я мог бы разобраться в этой проблеме. У меня нет большого опыта работы со статическими библиотеками, но я постараюсь объяснить проблему.
По какой-то причине 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
После этого, если я посмотрю на содержимое статической библиотеки, то обнаружу, что помимо файлов есть несколько странных каталогов:
$ 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
Теперь, если мы снова создадим библиотеку с извлеченными объектными файлами, она будет работать:
$ 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
Я совсем не понимаю причину, но у меня это сработало.
У меня была проблема с неправильным сообщением об ошибке архитектуры. Он сказал следующее:
ld: warning: ignoring file blah/lib/blahblah.a, file was built for archive which is not the architecture being linked (i386)
Липо дает: Нежирный файл: ../lib/blahblah.a является архитектура: x86_64
в make-файле сказано следующее:
ARCH_FLAG = -arch x86_64 -arch i386
Я закомментировал часть i386, и ошибка исчезла.
ARCH_FLAG = -arch x86_64 # -arch i386
Итак, я думаю, что вы можете получить ошибку по той же причине. Может быть, вам просто нужно установить класс архитектуры в соответствии с вашей библиотекой.
Кстати, мой make-файл был сгенерирован swig, и я не установил никаких ключей для компилятора.