2011-06-25 10 views
1

私はオープンソースのAAMライブラリをコンパイルしようとしています。私はVisual Studioで試してみましたが、コンパイルされていましたが、実行時にエラーが発生しました。今私はG ++を使ってUbuntu 11.04でコンパイルしようとしています。唯一提供されているmakefileはcygwin makefileです。私はこれを使ってUbuntuでコンパイルしようとしています。 (私は以下のmakefileを含んでいます)。私が抱えている問題は、行の一番下にあります。ubuntuのcygwin makefileを書く

libaamlibrary.dll.a: $(OBJS) 
     g++ -fPIC -shared $(OBJS) $(LIBS) -o cygaamlibrary-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker libaamlibrary.dll.a 

" - enable-auto-image-base"は認識されないオプションです。私はこれらの3行を、同じことをするがUbuntuで動作する形式に書き直そうとしていますが、実際に行が何をしているのかわからないので、苦労しています(例えば、使用すべきです)。何かアドバイスをいただければ幸いです...ここで参照するための完全なメイクファイルは、次のとおりです。

CPPFLAGS = -I. -I/home/andrew/MscProject/OpenCV-2.3.0/include/opencv -O2 -Wall -g -MD -fPIC 
PROGRAMS = libaamlibrary.dll.a libaamlibrary.a fit build 
LIBS = -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann 
OBJS = AAM_Util.o VJfacedetect.o AAM_Shape.o AAM_CAM.o AAM_PAW.o AAM_PDM.o AAM_TDM.o AAM_MovieAVI.o AAM_Basic.o AAM_IC.o 

all: $(PROGRAMS) 

AAM_Util.o: AAM_Util.cpp AAM_Util.h 
    g++ $(CPPFLAGS) -c -o AAM_Util.o AAM_Util.cpp 

AAM_Shape.o: AAM_Shape.cpp AAM_Shape.h 
    g++ $(CPPFLAGS) -c -o AAM_Shape.o AAM_Shape.cpp 

AAM_TDM.o: AAM_TDM.cpp AAM_TDM.h 
    g++ $(CPPFLAGS) -c -o AAM_TDM.o AAM_TDM.cpp 

AAM_PDM.o: AAM_PDM.cpp AAM_PDM.h 
    g++ $(CPPFLAGS) -c -o AAM_PDM.o AAM_PDM.cpp 

AAM_PAW.o: AAM_PAW.cpp AAM_PAW.h 
    g++ $(CPPFLAGS) -c -o AAM_PAW.o AAM_PAW.cpp 

AAM_CAM.o: AAM_CAM.cpp AAM_CAM.h 
    g++ $(CPPFLAGS) -c -o AAM_CAM.o AAM_CAM.cpp 

VJfacedetect.o: VJfacedetect.cpp VJfacedetect.h 
    g++ $(CPPFLAGS) -c -o VJfacedetect.o VJfacedetect.cpp 

AAM_MovieAVI.o: AAM_MovieAVI.cpp AAM_MovieAVI.h 
    g++ $(CPPFLAGS) -c -o AAM_MovieAVI.o AAM_MovieAVI.cpp 

AAM_Basic.o: AAM_Basic.cpp AAM_Basic.h 
    g++ $(CPPFLAGS) -c -o AAM_Basic.o AAM_Basic.cpp 

AAM_IC.o: AAM_IC.cpp AAM_IC.h 
    g++ $(CPPFLAGS) -c -o AAM_IC.o AAM_IC.cpp 

demo_build.o: train.cpp 
    g++ $(CPPFLAGS) -c -o demo_build.o train.cpp 

demo_fit.o: fit.cpp 
    g++ $(CPPFLAGS) -c -o demo_fit.o fit.cpp 

libaamlibrary.a: $(OBJS) 
    ar cru libaamlibrary.a $(OBJS) 
    ranlib libaamlibrary.a 

libaamlibrary.dll.a: $(OBJS) 
    g++ -fPIC -shared $(OBJS) $(LIBS) -o cygaamlibrary-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker libaamlibrary.dll.a 

fit: demo_fit.o 
    g++ -o fit demo_fit.o libaamlibrary.dll.a $(LIBS) 

build: demo_build.o 
    g++ -o build demo_build.o libaamlibrary.dll.a $(LIBS) 

clean: 
    rm -f *.o $(PROGRAMS) 

答えて

0

私は、.dll.aまたは.dll拡張子を使用しないことに同意します)、しかしあなたはlibaamlibrary [.dll] .aなしではできないようです。

' - enable-auto-image-base'の前に-Wlが付いているので、これはリンカー(ld)オプションになります。

私は「男のLD」を検索し、これを思い付いた:

--enable-自動画像ベース 自動的に1が "を使用して指定 でない限り、DLLのイメージベースを選択してください--image-base "引数を指定します。 dlnameから生成された ハッシュを使用して、各 DLLの一意のイメージベースを作成することにより、プログラム の実行を遅延させるメモリ内の衝突や再配置が回避されます。 [このオプションはi386 PE リンカーのターゲットポートに固有です]

ご使用のプラットフォームは何ですか?私が理解しているように非i386アーキテクチャでは利用できません。だから、あなたはそれなしでコンパイルを試みることができますか?

ところで、私は優れたAutotoolsパッケージ(automake/autoconf/libtool)の使用をお勧めします。

--out-implibに関しては、amd64では利用できません。

--out-IMPLIBファイル リンカーはDLLにリンカーを対応インポート LIBが発生している格納されるファイル・ファイルを作成します。このインポートにより、 lib(.dll.aまたは .aと呼ばれる)を使用して クライアントと生成されたDLLをリンクすると、 は別の "dlltool"インポートライブラリの作成をスキップできますステップ。[この オプションはリンカーのi386 PEターゲットポートに固有です]

申し訳ありませんが、私はインポートライブラリが何であるかわかりません。

+0

私はx86_64 Ubuntuを使用しています。 --enable-auto-image-baseを削除した場合、--out-implibも認識できないオプションになります。私はAutotoolsパッケージを調べます。どうもありがとう – Andrew

0

実践的アプローチ:最初にすべての.dll.dll.aものなしで構築してみてください。そのようなターゲットを参照する行を削除するだけです。

.dll.aファイルは高度なリンクシナリオで必要な位置非依存コード(PIC)を含む静的アーカイブです(共有ライブラリを自分で開発している場合)。 (たとえそのようなものが欲しいのであれば、Linuxでは.dll.aと呼ぶべきではありません)

+0

ご返信ありがとうございます。あなたは私が書き換え方法を説明することができます: フィット:demo_fit.o G ++ -oフィットdemo_fit.oを$(LIBS) – Andrew

+0

libaamlibrary.dll.a私は書いた場合:フィット:demo_fit.o G ++ -oフィットdemo_fit。 o $(LIBS)それから私は "未定義の参照"多くのコンパイルエラーを受け取ります – Andrew