为ubuntu编写一个cygwin makefile
writing a cygwin makefile for ubuntu
我正在尝试编译开源AAM库。我曾在VisualStudio中尝试过,尽管它进行了编译,但还是出现了运行时错误。现在我正在尝试使用G++在Ubuntu 11.04中编译它。提供的唯一生成文件是cygwin生成文件。我正试图用它在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
"--启用自动图像库"不是可识别的选项。我正试图将这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)
我同意你不应该使用.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/autocof/libtool)。
关于-out implib,它在amd64上也不可用。
--输出implib文件链接器将创建包含导入的文件文件lib对应于链接器正在生成的DLL。此导入lib(应称为".dll.a"或".a")可用于链接客户端针对生成的DLL;这种行为使它成为可能跳过单独的"dlltool"导入库创建步骤。[这个选项特定于链接器的i386 PE目标端口]
抱歉,我不知道什么是导入库。
实用方法:首先尝试在没有所有.dll
和.dll.a
的情况下进行构建;只需删除提及此类目标的行即可。
.dll.a
文件似乎是包含位置无关代码(PIC)的静态档案,这在高级链接场景中是必要的,即如果您自己开发共享库。(即使你想要这样的东西,你也不应该在Linux上称之为.dll.a
。)
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '