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

时间:2017-06-08 01:12:51

标签: c++ imagemagick magick++

美好的一天, 这是我的代码

#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没有正确编写时,经常会出现未定义引用的问题,但我是按照About Magick++, how to write the 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:错误:无法转换'Magick :: Image :: columns'   type'size_t(Magick :: Image ::)()const {aka long unsigned int   (Magick :: Image ::)()const}'键入'long unsigned int   (Magick :: Image :: *)()const'

发生了什么事?

P.S。万岁,这是我在stackoverflow上的第一个问题! : - )

2 个答案:

答案 0 :(得分:0)

如果您可以使用g++ main.cpp `Magick++-config --cxxflags --cppflags --ldflags --libs`在不使用CMake的情况下编译程序(但由于某种原因不能在CMake中使用${ImageMagick_LIBRARIES}),则可以在CMakeLists中使用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而不是{{ 1}}。最好在编程和CMake中都使用本地(基于目标的)命令,而不是修改全局状态,因为它们可能会对线下产生无法预料的影响-在CMake的上下文中,这些全局命令会影响嵌套的子目录。项目。

答案 1 :(得分:0)

我改编的 ForgottenUbrella 版本不太适合我,从另一个项目复制一行修复了它。请注意,我使用的是 c++20 而不是 11。

我有以下错误:

..... undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'

以及修复它的行:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -pthread")