[英]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.