1

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

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

  • 我使用“configure.exe”实用程序编译了静态 MT 运行时,并在 Visual Studio 中构建了它生成的解决方案“VisualStaticMT.sln”。这会在 C:\ImageMagick-6.9.3-2\VisualMagick\lib 中创建 lib 文件,例如“CORE_RL_Magick++_.lib”。

  • 在我的 C++11 程序中,与 ImageMagick 相关的配置是(我使用 QtCreator,但使用 MSVC2015 编译器):

    INCLUDEPATH += \
        C:\ImageMagick-6.9.3-2\ImageMagick\Magick++\lib \
        C:\ImageMagick-6.9.3-2\ImageMagick
    LIBS += \
        -lC:\ImageMagick-6.9.3-2\VisualMagick\lib\CORE_RL_Magick++_ \
        -lC:\ImageMagick-6.9.3-2\VisualMagick\lib\CORE_RL_wand_ \
        -lC:\ImageMagick-6.9.3-2\VisualMagick\lib\CORE_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)
release\corr.exe : fatal error LNK1120: 6 unresolved externals

“dllimport”错误让我感到惊讶,因为我认为我正在使用的“静态 MT 运行时”不应该涉及任何 DLL。

关于如何解决问题的任何想法?

谢谢。


编辑

我尝试过的其他几件事:

  • 将 libraires 与 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.9.3-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
    
4

3 回答 3

0

为了能够将您的应用程序与 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 将此库与其他名称链接,可能是错误),XX = RL 或 DB
于 2018-09-19T08:03:03.330 回答
0

链接 ImageMagick 静态库的答案是确保您也链接所有依赖的静态库!

为 ImageMagick 静态库编译解决方案后,转到“VisualMagick”文件夹(在 ImageMagick 克隆存储库中),然后转到“lib”文件夹,您将看到调试和发布的所有*_DB_*.lib文件*_RL_*.lib

您需要在发布和调试的“附加依赖项”部分中包含这些名称。

另一个关键方面是确保库是由相同的编译器为与您自己的应用程序相同的平台架构构建的..(WIN32 或 x64)。

于 2020-01-26T19:11:42.820 回答
0

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

你可以从下面给出的链接下载这个 lib 文件。

https://github.com/moravianlibrary/Open-DPI-Detector/tree/master/OpenDpiDetector/Libraries/ImageMagick-6.7.6/VisualMagick/lib

于 2016-04-15T07:59:01.870 回答