我正在尝试编译开源的AAM-library。我在Visual Studio中尝试过,虽然它编译了,但它有一个运行时错误。现在我正试着用G++在Ubuntu11.04中编译它。唯一提供的makefile是cygwin makefile。我正试着用它在Ubuntu中编译。(我已经在下面包含了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中也能正常工作,但我正在努力,因为我并不真正理解这些代码行在做什么(例如,我不理解Xlinker以及它应该如何使用)。任何建议都将不胜感激。下面是完整的makefile以供参考:
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)发布于 2011-06-26 03:18:21
我同意你不应该使用.dll.a或.dll扩展(我相信.a和.so是合适的),但似乎你不能没有libaamlibrary.dll.a。
因为'--enable-auto-image-base‘是以-Wl为前缀的,所以它是一个链接器(ld)选项。
我搜索“man ld”,结果是这样的:
除非使用“-- --enable-auto-image-base -
”参数指定了映像库,否则映像库将自动为DLL选择映像库。通过使用从DLL名生成的散列来为每个DLL创建唯一的映像库,避免了可延迟程序执行的存储器内冲突和重定位。此选项特定于链接器的i386 PE目标端口
你的平台是什么?据我所知,它不适用于非i386架构,也可能不需要?所以你可以试着不使用它来编译吗?
顺便说一句,我推荐使用优秀的Autotools包(automake/autoconf/libtool)。
关于--out-implib,它在amd64上也不可用。
--out-implib file链接器将创建文件文件,该文件将包含与链接器正在生成的DLL相对应的导入库。这个导入库(应该被称为".dll.a“或".a”)可以用来将客户端链接到所生成的DLL;这种行为使得可以跳过单独的"dlltool“导入库创建步骤。此选项特定于链接器的i386 PE目标端口
对不起,我不知道什么是导入库。
发布于 2011-06-26 02:32:57
实用方法:首先,尝试不使用所有.dll和.dll.a内容进行构建;只需删除引用这些目标的行。
看起来.dll.a文件是包含位置无关代码的静态存档,这在高级链接场景中是必需的,例如,如果你自己开发共享库。(即使您想要这样的东西,也不应该在Linux上称之为.dll.a。)
https://stackoverflow.com/questions/6479693
复制相似问题