簡體   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