web-dev-qa-db-ja.com

リンクされているアーキテクチャではないアーカイブ用に構築された静的ライブラリ(x86_64)

2つの異なるプログラムをコンパイルしようとすると、同じ問題が発生しているようです。それらのそれぞれは、最初に静的ライブラリを作成し、次にそのライブラリをリンクするメインアプリケーションを作成します。私はgcc4.7.2でMacOSMavericksに取り組んでいます。

プログラム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

どうしたの?

17
ChronoTrigger

同じ問題のこの質問 のおかげで、私はこの問題を調べることができました。静的ライブラリの経験はあまりありませんが、問題を説明しようと思います。

何らかの理由で、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

ここで、抽出したオブジェクトファイルを使用して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

理由は全くわかりませんが、うまくいきました。

5
ChronoTrigger

考えられる原因は、Xcodeツールチェーンによって提供されるものの代わりにGNU ar(1)/ranlib(1)を使用していることです。_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
_
25
a3f

binutilsがインストールされている場合は、リンクを解除するかアンインストールしてください

brew unlink binutils
4
VelocityPulse

libtool -static -aを使用すると、静的ライブラリを機能させるのが簡単になる場合があります。

Mac OS Xでの静的ライブラリリンクの問題:アーキテクチャx86_64のシンボルが見つかりません

4
prosseek

間違ったアーキテクチャエラーメッセージが表示されるという問題がありました。それは次のように言った:

 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

makefileで、次のように記述されています。Arch_FLAG= -Arch x86_64 -Arch i386

I386の部分をコメントアウトすると、エラーは消えました。 Arch_FLAG = -Arch x86_64#-Arch i386

したがって、同じ理由でエラーが発生している可能性があると思います。たぶん、ライブラリに一致するようにアーキテクチャクラスを設定する必要があります。

ちなみに、私のメイクファイルはswigによって生成されたもので、コンパイラーのスイッチを設定していませんでした。

1
jndaigle