0

我需要使用 Makefile 在我的项目中包含我的 Exiv2 扩展。我成功地通过终端直接运行它:

g++ -std=c++11 test.cpp -I/usr/local/include -L/usr/local/lib -lexiv2

我原来的 Makefile(它有效)重要部分:

COMPILER_FLAGS      =   -Wall -c -O2 -std=c++11 -fpic -o
LINKER_FLAGS        =   -shared
LINKER_DEPENDENCIES =   -lphpcpp -lopencv_core -lopencv_imgproc -lopencv_highgui \
                        -lopencv_ml -lopencv_video -lopencv_features2d \
                        -lopencv_calib3d -lopencv_objdetect \

现在我必须运行一个使用带有 Makefile 的 Exiv2 的程序。现在我正在尝试自定义 Makefile,尝试过

COMPILER_FLAGS      =   -Wall -c -O2 -std=c++11 -I/usr/local/include -L/usr/local/lib -fpic -o
LINKER_FLAGS        =   -shared
LINKER_DEPENDENCIES =   -lphpcpp -lopencv_core -lopencv_imgproc -lopencv_highgui \
                        -lopencv_ml -lopencv_video -lopencv_features2d \
                        -lopencv_calib3d -lopencv_objdetect \
                        -lexiv2 \

不起作用,make的输出是:

[root@localhost psdk4]# make
g++ -Wall -c -O2 -std=c++11 -I/usr/local/include -L/usr/local/lib -fpic -o metacopy.o metacopy.cpp
metacopy.cpp: In member function ‘int Params::copyMetadata(int, char**)’:
metacopy.cpp:50:9: error: ‘AutoPtr’ is not a member of ‘Exiv2::BasicIo’
         Exiv2::BasicIo::AutoPtr fileIo(new Exiv2::FileIo(params.read_));
         ^
metacopy.cpp:50:33: error: expected ‘;’ before ‘fileIo’
         Exiv2::BasicIo::AutoPtr fileIo(new Exiv2::FileIo(params.read_));

...

这意味着它没有找到Exiv2方法,如何自定义我的Makefile?

4

2 回答 2

0

This worked:

readImg = Exiv2::ImageFactory::open(std::move(memIo));
于 2020-08-19T14:59:05.910 回答
0

AutoPtr(这是 的别名std::auto_ptr)于 2018 年 12 月从 Exiv2 中删除。请注意,std::auto_ptr它本身在 2011 年从 C++ 中弃用,并在 2017 年完全删除。

Github 上的相关差异

您依赖的代码AutoPtr太旧了。您可能可以通过替换为来更新AutoPtrUniquePtr。您将必须找到复制前者的所有位置auto_ptr(分配、传递给函数等)并std::move在副本源周围插入调用。编译器会报错一个被删除的函数(拷贝构造函数或者拷贝赋值),所以很容易一一修复这些地方。例如:

 AutoPtr some_variable = ...;
 ...
 some_function(some_variable);

需要成为

 UniquePtr some_variable = ...;
 ...
 some_function(std::move(some_variable));
于 2020-08-19T12:46:16.463 回答