很长一段时间以来,我一直在寻找解决这个问题的方法,但没有结果。我试图编译这个简单的程序:
#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");
}
在构建时,我会得到以下错误:
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
包括:
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++项目添加外部依赖项的过程,我还比较陌生,所以这是一个陌生的领域(来自具有干净包管理器的语言)。任何关于如何解决这个问题的帮助都是非常感谢的!
发布于 2022-10-10 08:11:00
在CMake中处理依赖关系的典型(也是最简单的)方法是使用它的find_package
命令:
find_package(ImageMagick REQUIRED COMPONENTS MagickCore MagickWand Magick++)
// ...
target_link_libraries(main ${ImageMagick_LIBRARIES})
此方法是可用 for ImageMagick和您的CMake版本。我不熟悉Windows上的CMake,但是默认情况下,find_package
会在许多标准(系统)位置搜索包的文件。因为您有一个自定义设置,所以还应该可以为命令指定一个非标准的搜索前缀。此外,您可以使用FetchContent命令以可移植的方式下载外部依赖项。
发布于 2022-10-11 16:01:33
首先,如果你是像我这样的新手,设置这个东西是件痛苦的事。
下面是将imagemagick库与您的C应用程序动态链接的步骤:
VisualDynamicMT.sln
时,在启动build
之前,选择项目中的所有解决方案,然后右键单击-> properties -> General -> C Language Standard ->选择默认值(Legacy MSVC)。然后,单击包含所有其他196种解决方案的最上面的解决方案,然后构建它。注意控制台的错误,上面的配置没有出现任何错误。VisualMagick
文件夹(根据前面的步骤创建),您将看到lib
文件夹和bin
文件夹。您完成了,您的dlls
在bin
中,.lib
文件在bin
文件夹中。请注意,根据您在构建步骤中在visual studio中选择的内容,这些文件将对应于生成或发布环境。src
内部,您将放置C代码。deps
内部创建ImageMagick/lib
、ImageMagick/bin
和ImageMagick/include
ImageMagick/include
中放置相同的文件,你说你在你的问题中得到。ImageMagick/lib
中放置您从上面获得的.lib
文件ImageMagick/bin
中放置您从上面获得的.dll
文件CMakeLists.txt
中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
https://stackoverflow.com/questions/74009158
复制相似问题