首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图编译和简单ImageMagick程序时未定义的引用错误

试图编译和简单ImageMagick程序时未定义的引用错误
EN

Stack Overflow用户
提问于 2022-10-09 23:50:30
回答 2查看 58关注 0票数 0

很长一段时间以来,我一直在寻找解决这个问题的方法,但没有结果。我试图编译这个简单的程序:

代码语言:javascript
运行
复制
#include <iostream>
#include <Magick++.h>
#include <Magick++/Image.h>

using namespace std;
using namespace Magick;

int main(int argc,char **argv) {
    InitializeMagick("D:\\Programming\\CPPProjects\\NoteScripts\\Dependencies\\magick\\include");
    Image image; 
    // image.read("arch");
    // image.write("test.png");
}

在构建时,我会得到以下错误:

代码语言:javascript
运行
复制
CMakeFiles\main.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1c): undefined reference to `Magick::InitializeMagick(char const*)'
CMakeFiles\main.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x28): undefined reference to `Magick::Image::Image()'
CMakeFiles\main.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x34): undefined reference to `Magick::Image::~Image()'
collect2.exe: error: ld returned 1 exit status

据我所知,这是一个链接错误,但我不知道我的地方是错误的链接库所需。

我用这个安装程序在Windows 10上安装了ImageMagick :ImageMagick-7.1.050-Q16-HDRI-x64-dll.exe

然后我将安装目录下的lib文件夹中的库文件复制到我的项目中,然后将安装目录下的include文件夹复制到我的项目中。

下面是项目层次结构的样子(源代码目录是NoteScripts):

我的CMakeLists.txt包括:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.10)

set( CMAKE_CXX_COMPILER "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe")
set( CMAKE_C_COMPILER "C:/Program Files/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/mingw64/bin/gcc.exe" )
# set the project name
project("Notes")

include_directories(D:/Programming/CPPProjects/NoteScripts/Dependencies/magick/include)

# add the executable
add_executable(main main.cpp)
target_link_libraries(main D:/Programming/CPPProjects/NoteScripts/Dependencies/magick/lib/CORE_RL_Magick++_.lib)
target_link_libraries(main D:/Programming/CPPProjects/NoteScripts/Dependencies/magick/lib/CORE_RL_MagickCore_.lib)
target_link_libraries(main D:/Programming/CPPProjects/NoteScripts/Dependencies/magick/lib/CORE_RL_MagickWand_.lib)

如果我注释掉了调用InitializeMagick()和声明Image image的第9行和第10行,那么程序编译就没有错误。我还知道静态库的顺序列出了一些问题,但是尝试多个组合会导致相同的错误。我还通过筛选原始源代码来验证依赖关系顺序,参考路径是Magick++ -> MagickCore -> MagickWand。

对于向我的C++项目添加外部依赖项的过程,我还比较陌生,所以这是一个陌生的领域(来自具有干净包管理器的语言)。任何关于如何解决这个问题的帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

发布于 2022-10-10 08:11:00

在CMake中处理依赖关系的典型(也是最简单的)方法是使用它的find_package命令:

代码语言:javascript
运行
复制
find_package(ImageMagick REQUIRED COMPONENTS MagickCore MagickWand Magick++)

// ...

target_link_libraries(main ${ImageMagick_LIBRARIES})

此方法是可用 for ImageMagick和您的CMake版本。我不熟悉Windows上的CMake,但是默认情况下,find_package会在许多标准(系统)位置搜索包的文件。因为您有一个自定义设置,所以还应该可以为命令指定一个非标准的搜索前缀。此外,您可以使用FetchContent命令以可移植的方式下载外部依赖项。

票数 0
EN

Stack Overflow用户

发布于 2022-10-11 16:01:33

首先,如果你是像我这样的新手,设置这个东西是件痛苦的事。

下面是将imagemagick库与您的C应用程序动态链接的步骤:

  • 转到https://github.com/ImageMagick/ImageMagick-Windows并按照那里的说明(安装Visual依赖项- Clone - Build configure.exe- Build ImageMagick)
  • 在步骤Build configure.exe中,当运行时,保留在询问输出库类型时选择的默认选项(将其设置为动态)
  • 在Build ImageMagick步骤中,在visual中打开VisualDynamicMT.sln时,在启动build之前,选择项目中的所有解决方案,然后右键单击-> properties -> General -> C Language Standard ->选择默认值(Legacy MSVC)。然后,单击包含所有其他196种解决方案的最上面的解决方案,然后构建它。注意控制台的错误,上面的配置没有出现任何错误。
  • 在后一步之后,转到VisualMagick文件夹(根据前面的步骤创建),您将看到lib文件夹和bin文件夹。您完成了,您的dllsbin中,.lib文件在bin文件夹中。请注意,根据您在构建步骤中在visual studio中选择的内容,这些文件将对应于生成或发布环境。
  • 你现在如何在你的项目中使用imagemagick,不管你是否在你的电脑上安装了imagemagick应用程序?让我们用vscode创建一个新项目,称之为演示。
  • 创建此项目结构:
  • src内部,您将放置C代码。
  • deps内部创建ImageMagick/libImageMagick/binImageMagick/include
  • ImageMagick/include中放置相同的文件,你说你在你的问题中得到。
  • ImageMagick/lib中放置您从上面获得的.lib文件
  • ImageMagick/bin中放置您从上面获得的.dll文件
  • 现在将其添加到您的CMakeLists.txt
代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.23)

project(demo-app C)

set(CMAKE_CXX_STANDARD 23)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

file(GLOB SOURCE_FILES src/*.c)

add_executable(demo ${SOURCE_FILES})

include_directories(src)

# ImageMagick
if(WIN32)
    add_definitions( -DMAGICKCORE_QUANTUM_DEPTH=16 )
    add_definitions( -DMAGICKCORE_HDRI_ENABLE=0 )
    include_directories(deps/ImageMagick/include)
    target_link_directories(demo PRIVATE deps/ImageMagick/lib)
    file(GLOB IMAGEMAGICK_LIBS deps/ImageMagick/lib/*.lib)
    target_link_libraries(demo 
        "${IMAGEMAGICK_LIBS}"
    )
    add_custom_command(TARGET demo POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/deps/ImageMagick/bin"
            $<TARGET_FILE_DIR:demo>)
endif()

( add_custom_command将在每次构建后将dlls复制到可执行文件路径)

  • 现在,在您的src目录中编写一些魔法代码。
  • ctrl + shift + A -> CMake select kit ->选择Visual Studio community 2022 release -amd64或更改不适合您的内容
  • ctrl + shift + A -> CMake Clean Rebuild
  • ctrl + shift + A -> CMake run without debugging
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74009158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档