如何修改Makefile以在项目中正确引入Exiv2扩展?
解决Makefile引入Exiv2扩展的编译问题
从你的错误信息来看,核心问题有两个:Makefile里的参数放错了编译/链接阶段,以及编译器没正确识别Exiv2的类型定义。咱们一步步来修复:
1. 修正Makefile的参数位置
你把链接器专用的-L/usr/local/lib放到了编译阶段的COMPILER_FLAGS里,这是无效的——编译阶段(带-c参数)只需要处理头文件路径(-I),库路径和库链接是链接阶段的事。
修改后的Makefile应该把-L移到链接器参数中:
COMPILER_FLAGS = -Wall -c -O2 -std=c++11 -I/usr/local/include -fpic -o LINKER_FLAGS = -shared -L/usr/local/lib LINKER_DEPENDENCIES = -lphpcpp -lopencv_core -lopencv_imgproc -lopencv_highgui \ -lopencv_ml -lopencv_video -lopencv_features2d \ -lopencv_calib3d -lopencv_objdetect \ -lexiv2
关键调整说明:
- 编译阶段:
COMPILER_FLAGS只保留-I/usr/local/include,确保编译器能找到Exiv2的头文件(比如exiv2/exiv2.hpp)。 - 链接阶段:在
LINKER_FLAGS中加入-L/usr/local/lib,告诉链接器到这个路径下查找Exiv2的库文件;LINKER_DEPENDENCIES里的-lexiv2负责链接Exiv2库。
2. 确认代码中的头文件包含
检查你的metacopy.cpp是否正确包含了Exiv2的核心头文件:
#include <exiv2/exiv2.hpp>
如果漏了这个,编译器根本找不到Exiv2::BasicIo这类类型定义,自然会报错。
3. 额外排查:Exiv2版本兼容性(如果上述修改后仍有问题)
如果修正Makefile后还是出现AutoPtr相关错误,那可能是你使用的Exiv2版本较新(0.27及以上)——这个版本里Exiv2::BasicIo::AutoPtr已经被替换成了std::unique_ptr<Exiv2::BasicIo>。此时需要修改代码:
// 旧代码 Exiv2::BasicIo::AutoPtr fileIo(new Exiv2::FileIo(params.read_)); // 替换为 std::unique_ptr<Exiv2::BasicIo> fileIo(new Exiv2::FileIo(params.read_));
不过你之前用终端命令能成功编译,说明终端环境下的Exiv2版本和代码兼容,所以优先解决Makefile的参数问题即可。
内容的提问来源于stack exchange,提问作者Tomer Barak
相关产品推荐
相关产品推荐

