尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误相关的知识,希望对你有一定的参考价值。

这个问题已经被问到here,但由于我有更多的细节需要提供,我认为最好从一个新问题开始。

我在使用Visual Studio MSVC 2015编译器的程序中链接ImageMagick lib文件时遇到问题。以下是我遵循的步骤:

  • 我已经使用“configure.exe”实用程序编译了静态MT运行时,并在Visual Studio中内置了它生成的解决方案“VisualStaticMT.sln”。这将在C: ImageMagick-6.9.3-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中的以下行链接具有相同的错误: qazxsw poi
  • 我试图添加位于C: ImageMagick-6.9.3-2 VisualMagick lib中的所有27个lib文件。如果我排除CORE_RL_exr_.lib,我会得到同样的错误。如果我包含它,我会收到其他错误,表明不应添加此文件: #pragma comment(lib, "CORE_RL_Magick++_.lib") #pragma comment(lib, "CORE_RL_wand_.lib") #pragma comment(lib, "CORE_RL_magick_.lib")
答案

可能你错过了一些库文件。因为你的程序无法链接库文件,这就是它给链接器错误的原因。尝试从外部链接lib文件..在main方法之前尝试此代码.. #pragma comment(lib,“CORE_DB_magick ++。lib”)

您可以从以下给定的链接下载此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

另一答案

为了能够将您的应用程序与静态构建的ImageMagick链接,您必须做几个技巧(对于https://github.com/moravianlibrary/Open-DPI-Detector/tree/master/OpenDpiDetector/Libraries/ImageMagick-6.7.6/VisualMagick/lib):

  • 将预处理器定义ImageMagick-7.0.8-11添加到您的visual studio项目中
  • 在Linker-> Input中添加缺少的输入库STATIC_MAGICK(其他libs ImageMagick通过#pragma自动添加)
  • 重命名CORE_XX_liblzma_.pdb - > CORE_XX_lzma_.lib(ImageMagick将此lib与其他名称链接,可能是bug),XX = RL或DB

以上是关于尝试将ImageMagick用作Visual Studio编译器的静态库时出现链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual C#,无法将我的struct用作属性

Windows下用Visual Studio来build ImageMagick

Visual Studio2013下Magick++配置方法

如果无法创建 vcxproj 文件,是不是可以将 MSBuild 用作带有 Visual Studio 代码的 C++ 编译器?

有没有办法在 Visual Studio 中模拟 Sublime Text 的“多光标”功能?

ST Visual Programmer批量烧写教程