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

Linker error when trying to use ImageMagick as static libraries with Visual Studio compiler

本文关键字:链接 错误 静态 ImageMagick 用作 Visual 编译器 Studio      更新时间:2023-10-16

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

我在使用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)。