[英]Magick++ undefined reference to Magick::Image::Columns
美好的一天,这是我的代码
#include <iostream>
#include <Magick++.h>
using namespace std;
using namespace Magick;
int main(int argc, char **argv) {
InitializeMagick(*argv);
Image image;
try {
image.read(argv[1]);
}
catch( Exception &error_ ) {
cout << "Caught exception: " << error_.what() << endl;
return 1;
}
int x = image.columns();
cout<<"your picture's width is "<< x << "px"<<endl;
return 0;
}
我使用KDevelop(使用CMake作为构建器),当我尝试编译应用程序时,它会抛出一个错误
main.cpp:25:对`Magick :: Image :: columns()const'的未定义引用
这是我的CMakeLists.txt包含的内容。
cmake_minimum_required(VERSION 3.5)
project(hello)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(hello ${SOURCE_FILES})
add_definitions( -DMAGICKCORE_QUANTUM_DEPTH=16 )
add_definitions( -DMAGICKCORE_HDRI_ENABLE=0 )
find_package(ImageMagick COMPONENTS Magick++)
include_directories(${ImageMagick_INCLUDE_DIRS})
target_link_libraries(hello ${ImageMagick_LIBRARIES})
我发现当CMakeLists没有正确编写时,经常会出现未定义引用的问题,但我是根据这个关于Magick ++编写的,如何编写CMakeLists?
我哪里错了? 我可以添加所需的任何信息。
UPD 1. magick ++版本,8:6.8.9.9-7ubuntu5.7
系统信息:说明:Linux Mint 18.1 Serena
UPD 2.我刚刚删除了括号,并在尝试编译时
size_t x = image.columns;
size_t y = image.rows;
KDevelop把我扔了
main.cpp:25:22:错误:无法从'size_t类型转换'Magick :: Image :: columns'(Magick :: Image ::)()const {aka long unsigned int(Magick :: Image ::)( )const}'键入'size_t {aka long unsigned int}'
即便
auto x = image.columns;
auto y = image.rows;
它抛出
main.cpp:25:20:错误:无法从'size_t类型转换'Magick :: Image :: columns'(Magick :: Image ::)()const {aka long unsigned int(Magick :: Image ::)( )const}'输入'long unsigned int(Magick :: Image :: *)()const'
发生了什么?
PS万岁,这是我在stackoverflow上的第一个问题! :-)
如果你能够在没有CMake的情况下使用g++ main.cpp `Magick++-config --cxxflags --cppflags --ldflags --libs`
编译你的程序g++ main.cpp `Magick++-config --cxxflags --cppflags --ldflags --libs`
(但由于某些原因不能在CMake中使用${ImageMagick_LIBRARIES}
),那么你可以在你的CMakeLists.txt中使用Magick++-config
:
cmake_minimum_required(VERSION 3.5)
project(hello LANGUAGES CXX)
add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_11)
find_package(ImageMagick REQUIRED COMPONENTS Magick++)
target_compile_definitions(hello PRIVATE
MAGICKCORE_QUANTUM_DEPTH=16
MAGICKCORE_HDRI_ENABLE=0
)
target_include_directories(hello PRIVATE ${ImageMagick_INCLUDE_DIRS})
execute_process(COMMAND Magick++-config --ldflags
OUTPUT_VARIABLE ImageMagick_LINK_FLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
target_link_libraries(hello PRIVATE ${ImageMagick_LINK_FLAGS})
在这里, execute_process
让我们获得的结果Magick++-config --ldflags
到一个变量,我们可以通过为标志传给连接target_link_libraries
。
另外,请注意我是如何使用target_compile_features
而不是设置全局CMAKE_CXX_FLAGS
变量target_compile_definitions
而不是add_definitions
和target_include_directories
而不是include_directories
。 最好在编程和CMake中使用本地(基于目标)命令而不是修改全局状态,因为它们可能会产生无法预料的影响 - 在CMake的上下文中,这些全局命令会影响嵌套子命令。项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.