繁体   English   中英

Magick ++ undefined对Magick :: Image :: Columns的引用

[英]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_definitionstarget_include_directories而不是include_directories 最好在编程和CMake中使用本地(基于目标)命令而不是修改全局状态,因为它们可能会产生无法预料的影响 - 在CMake的上下文中,这些全局命令会影响嵌套子命令。项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM