尝试将ImageMagick用作Visual Studio编译器的静态库时发生链接器错误
Linker error when trying to use ImageMagick as static libraries with Visual Studio compiler
这里已经问过这个问题,但由于我有更多的细节要提供,我认为最好从一个新问题开始
我在使用Visual Studio MSVC 2015编译器的程序中链接ImageMagick库文件时遇到问题。以下是我所遵循的步骤:
-
我使用"configure.exe"实用程序编译了静态MT运行时,并在Visual Studio中构建了它生成的解决方案"VisualStaticMT.sln"。这会在C:\ImageMagick-6.93-2\VisualMagick\lib.中创建诸如"CORE_RL_Magick++_.lib"之类的lib文件
-
在我的C++11程序中,与ImageMagick相关的配置是(我使用QtCreator,但使用MSVC2015编译器):
INCLUDEPATH += C:ImageMagick-6.9.3-2ImageMagickMagick++lib C:ImageMagick-6.9.3-2ImageMagick LIBS += -lC:ImageMagick-6.9.3-2VisualMagicklibCORE_RL_Magick++_ -lC:ImageMagick-6.9.3-2VisualMagicklibCORE_RL_wand_ -lC:ImageMagick-6.9.3-2VisualMagicklibCORE_RL_magick_ QMAKE_CXXFLAGS += -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16
程序的一部分包含:
#include <Magick++.h>
...
Magick::Image img;
img = Magick::Image(filename);
编译时我得到链接错误:
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Image::Image(void)" (__imp_??0Image@Magick@@QAE@XZ) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall Magick::Image::Image(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_??0Image@Magick@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall Magick::Image::~Image(void)" (__imp_??1Image@Magick@@UAE@XZ) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: class Magick::Image & __thiscall Magick::Image::operator=(class Magick::Image const &)" (__imp_??4Image@Magick@@QAEAAV01@ABV01@@Z) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall Magick::Image::write(long,long,unsigned int,unsigned int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum MagickCore::StorageType,void *)" (__imp_?write@Image@Magick@@QAEXJJIIABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4StorageType@MagickCore@@PAX@Z) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
movie.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: struct MagickCore::_Image const * __thiscall Magick::Image::constImage(void)const " (__imp_?constImage@Image@Magick@@QBEPBU_Image@MagickCore@@XZ) referenced in function "public: __thiscall Frame<unsigned char>::Frame<unsigned char>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0?$Frame@E@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
releasecorr.exe : fatal error LNK1120: 6 unresolved externals
"dllimport"错误让我大吃一惊,因为我认为我使用的"静态MT运行时"不应该有DLL。
你知道我该怎么解决这个问题吗?
谢谢。
编辑
我还尝试了一些东西:
将库与main.cpp中的以下行链接会出现相同的错误:
#pragma comment(lib, "CORE_RL_Magick++_.lib") #pragma comment(lib, "CORE_RL_wand_.lib") #pragma comment(lib, "CORE_RL_magick_.lib")
我试图添加C:\ImageMagick-6.93-2\VisualMagick\lib中的所有27个lib文件。如果我排除CORE_RL_exr.lib,我会得到同样的错误。如果我包括它,我会得到额外的错误,建议不应该添加这个文件:
CORE_RL_exr_.lib(IexBaseExc.obj):-1: error: LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in main.obj
您可能缺少一些库文件。因为您的程序无法链接库文件,所以它会出现链接器错误。尝试从外部链接lib文件。。请在主方法之前尝试此代码。。#pragma注释(lib,"CORE_DB_magick++.lib")
您可以从下面的链接下载这个lib文件。
https://github.com/moravianlibrary/Open-DPI-Detector/tree/master/OpenDpiDetector/Libraries/ImageMagick-6.7.6/VisualMagick/lib
要将您的应用程序与静态构建的ImageMagick链接起来,您必须执行以下操作(如ImageMagick-7.0.8-11
):
- 将预处理器定义
STATIC_MAGICK
添加到visual studio项目中 - 在Linker->input中添加缺少的输入库
CORE_DB_croco_.lib/CORE_RL_croco_.lib
(其他库ImageMagick通过#pragma自动添加) - 重命名CORE_XX_liblzma_.pdb->CORE_XX_lzma_.lib(ImageMagick将此lib与其他名称链接,可能是bug),XX=RL或DB
链接ImageMagick静态库的答案是确保您也链接所有依赖的静态库!
编译完ImageMagick静态库的解决方案后,转到"VisualMagick"文件夹(在ImageMagick克隆的存储库中),然后转到"lib"文件夹,您将看到用于调试和发布的所有*_DB_*.lib
和*_RL_*.lib
文件。
您需要在Release和Debug的"附加依赖项"部分中包含这些名称。
另一个关键方面是确保库是由相同的编译器为与您自己的应用程序相同的平台体系结构构建的。。(WIN32或x64)。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误