首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为ubuntu编写cygwin makefile

为ubuntu编写cygwin makefile
EN

Stack Overflow用户
提问于 2011-06-26 02:20:52
回答 2查看 748关注 0票数 1

我正在尝试编译开源的AAM-library。我在Visual Studio中尝试过,虽然它编译了,但它有一个运行时错误。现在我正试着用G++在Ubuntu11.04中编译它。唯一提供的makefile是cygwin makefile。我正试着用它在Ubuntu中编译。(我已经在下面包含了makefile )。我遇到的问题几乎是最底层的:

代码语言:javascript
复制
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以供参考:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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目标端口

对不起,我不知道什么是导入库。

票数 0
EN

Stack Overflow用户

发布于 2011-06-26 02:32:57

实用方法:首先,尝试不使用所有.dll.dll.a内容进行构建;只需删除引用这些目标的行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6479693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档