为 ubuntu 编写 cygwin makefile

问题描述 投票:0回答:2

我正在尝试编译开源 AAM 库。我在 Visual Studio 中尝试过,虽然编译成功,但出现运行时错误。现在我尝试使用 G++ 在 Ubuntu 11.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)
c++ makefile g++ cygwin
2个回答
0
投票

我同意你不应该使用.dll.a或.dll扩展名(我相信.a和.so是合适的),但似乎没有libaamlibrary[.dll].a.

由于“--enable-auto-image-base”带有 -Wl 前缀,这使其成为链接器 (ld) 选项。

我搜索了“man ld”并想到了这个:

--启用自动图像库 自动选择 DLL 的映像库,除非是 使用“--image-base”参数指定。 通过使用哈希 从 dllname 生成,为每个创建唯一的图像库 DLL、内存中冲突和重定位可能会延迟程序 避免执行。 [此选项特定于 i386 PE 链接器的目标端口]

你们的平台是什么?据我了解,它不适用于非 i386 架构,也许不需要?那么你可以尝试在没有它的情况下编译吗?

顺便说一下,我推荐使用优秀的 Autotools 包(automake/autoconf/libtool)。

关于 --out-implib 它在 amd64 上也不可用。

--out-implib 文件 链接器将创建包含导入的文件 lib 对应于链接器生成的 DLL。此次进口 lib(应称为“.dll.a”或“.a”可用于链接 客户端针对生成的 DLL;这种行为使之成为可能 跳过单独的“dlltool”导入库创建步骤。 [这 选项特定于链接器的 i386 PE 目标端口]

抱歉,我不知道导入库是什么。


0
投票

实用方法:首先尝试在没有所有

.dll
.dll.a
的情况下进行构建;只需删除引用此类目标的行即可。

.dll.a
文件似乎是包含位置无关代码(PIC)的静态档案,这在高级链接场景中是必需的,即如果您自己开发共享库。 (即使你想要这样的东西,你也不应该在 Linux 上称它为
.dll.a
。)

© www.soinside.com 2019 - 2024. All rights reserved.