如何使用CMake将ImageMagick/Magick++添加到我的c++项目中?

x33g5p2x  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(196)

我是CMake的新手。我试图在我的代码中使用ImageMagick的c++ api Magick++
这是我的整个目录结构:

external/image_magick只包含使用以下方法克隆image magick库的结果:git submodule add https://github.com/ImageMagick/ImageMagick.git external/image_magick .
这是顶层CMakeLists.txt(上图中的一个):

cmake_minimum_required (VERSION 3.22.1)
project(DEMO)
add_executable(${PROJECT_NAME} main.cpp)

这是main.cpp(它只是裁剪图像magick图像并保存它,只是为了演示):


# include <iostream>

# include <Magick++.h>

using namespace std;

using namespace Magick;

int main()
{
    cout << "Hello World!" << endl;

    // Construct the image object. Seperating image construction from the
    // the read operation ensures that a failure to read the image file
    // doesn't render the image object useless.
    Image image;
    try
    {
        // Read a file into image object
        image.read("logo:");

        // Crop the image to specified size (width, height, xOffset, yOffset)
        image.crop(Geometry(100, 100, 100, 100));

        // Write the image to a file
        image.write("logo.png");
        printf("Image written to logo.png");
    }
    catch (Exception &error_)
    {
        cout << "Caught exception: " << error_.what() << endl;
        printf("Error: %s", error_.what());
        return 1;
    }

    return 0;
}

如果我像这样编译和运行应用程序(根据图像magick文档):

c++ main.cpp -o main.out `Magick++-config --cppflags --cxxflags --ldflags --libs`
./main.out

然后一切都很好,图像生成。
但是我不能像这样使用CMakeLists.txt来构建和运行:

cmake -S . -B out/build
cd out/build; make
cd out/build
./DEMO

因为我克隆的external/image_magick目录不包含CMakeLists.txt。我试着在该目录中搜索库文件(类似于libmagic++??),以便在我的顶级CMakeLists.txt中使用它,但我不知道如何操作:

add_subdirectory(external/image_magick/Magick++)

target_include_directories(${PROJECT_NAME} 
    PUBLIC external/image_magick/
)
target_link_directories(${PROJECT_NAME} 
PRIVATE external/image_magick/Magick++
)
target_link_libraries(${PROJECT_NAME} 
    PUBLIC ${PROJECT_SOURCE_DIR}/Magick++
)

# DOES NOT WORK

那么,如何在继续使用CMAke的同时将此库正确添加到我的应用程序中呢?

bqujaahr

bqujaahr1#

我也遇到过类似的问题,通过使用set命令而不是link_libraries解决了这个问题,如下所示:

set(CMAKE_CXX_FLAGS "-LlibraryPath -lMagick++ ${CMAKE_CXX_FLAGS}")

我知道这不是这个的预期用途,但这是我得到我的项目建设的方式。
此外,C/C++库可能会有许多问题,因为每个人都有需要问的manymanyMANY问题。

w8biq8rn

w8biq8rn2#

根据answer,解决方案是将以下内容添加到CMakeLists.txt中:


# ImageMagick

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(demo ${ImageMagick_LIBRARIES})

相关问题