将 DCMTK 与 Visual Studio 一起使用时出现链接器错误 LNK2019

Posted

技术标签:

【中文标题】将 DCMTK 与 Visual Studio 一起使用时出现链接器错误 LNK2019【英文标题】:Linker error LNK2019 when using DCMTK with Visual Studio 【发布时间】:2016-11-23 08:57:37 【问题描述】:

这不是一个新问题,但解决方案对我不起作用。我想使用 C++ 读取 dicom 文件。我有 32 位 Windows PC 和 VS 2013 社区版。

This post 和其中的其他答案建议使用 DCMTK。我安装了 DCMTK(使用 CMake,后跟 VS)并使用this post 中提供的指南和链接将其配置为与 VS 一起使用。然后我写了一个简单的test program 并尝试编译它:

#include "stdafx.h"
#include "dcmtk\dcmdata\dctk.h"
#include "dcmtk\config\osconfig.h"
#include "dcmtk\dcmimgle\dcmimage.h"
#include <iostream>
using namespace std;

int main()

    DicomImage *image = new DicomImage("test.dcm");
    if (image != NULL)
    
        if (image->getStatus() == EIS_Normal)
        
            if (image->isMonochrome())
            
                image->setMinMaxWindow();
                Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 /* bits */));
                if (pixelData != NULL)
                
                    /* do something useful with the pixel data */
                
            
        
        else
            cerr << "Error: cannot load DICOM image (" << DicomImage::getString(image->getStatus()) << ")" << endl;
    
    delete image; 
    return 0;

编译后报错:

dcmdata.lib(dcuid.obj) : error LNK2019: unresolved external symbol _Netbios@4 referenced in function "unsigned char * __cdecl getMACAddress(unsigned char * const)" (?getMACAddress@@YAPAEQAE@Z)

这个错误似乎很常见,但以下解决方案都不适合我:

    DCMTK 论坛的FAQ#27 和another post:建议使用特定顺序的lib 文件被包含。我包含文件的顺序如下(我也尝试了相反的顺序,但没有奏效):

所有这些都不起作用。 事实上,我不确定应该包含哪些 lib 文件?如何决定?

我还在项目属性的其他库目录下包含“C:\Program Files\DCMTK\lib”,在其他包含目录下包含“C:\Program Files\DCMTK\include”。

    Another similar question 在 *** 上尚未得到答复。评论建议通过禁用 DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS 重新运行 CMake。我没有这样做是因为DCMTK help page 说除非你真的知道你在做什么,否则不要禁用它。

有人可以指导吗?

【问题讨论】:

【参考方案1】:

NetBios 函数位于 NETAPI32.LIB 中,因此您可以尝试将 NetAPI32.lib(在您的列表中)移动到该列表的顶部。

【讨论】:

我将 NETAPI32.lib 移到顶部,使列表的其余部分保持不变,但它不起作用:(【参考方案2】:

不确定您使用的是哪个版本的 DCMTK,但对于当前的开发快照,您需要以下标准库(在 Windows 上):“ws2_32 netapi32 wsock32”。此信息可在 DCMTK 的 CMake 文件中找到。顺便说一句,您的项目似乎没有使用 CMake,对吧?

【讨论】:

我使用 DCMTK 3.6.0,我正在使用 CMake。我也尝试包含 ws2_32 ,但它仍然不起作用。 (我查看了 CmakeLists.txt 以找到此信息,谢谢。)【参考方案3】:

我认为您将 dcmsign.lib 拼错为 dcmsig.lib。

如果更改不能解决问题,我会根据您链接到的支持页面建议以下顺序: NetAPI32.lib WSock32.lib 标准库 oflog.lib dcmdata.lib dcmsign.lib dcmnet.lib dcmsr.lib dcmqrdb.lib dcmtls.lib dcmwlm.lib dcmimgle.lib dcmpstat.lib dcmjpls.lib dcmjpeg.lib dcmimage.lib ijg16.lib ijg12.lib ijg8.lib

我认为在这个列表中,每个库都必须排在它所依赖的所有库之后。

【讨论】:

其实我没有dcmsign.lib这样的文件。相反,我有我提到的 dcmdsig.lib。我还尝试了您建议的顺序,还包括@J 建议的 ws2_32.lib。 Riesmeier,但它仍然不起作用。对于我遵循这篇文章的顺序:***.com/a/798086/5022962 但它似乎暗示了另一种方式(与你所说的相比)。我不确定哪个是正确的,所以我也尝试了相反的顺序,但它不起作用。 是的,库名实际上是“dcmdsig.lib”,即与DCMTK的模块目录名称不一样,因为与命令行工具“dcmsign”冲突。关于库顺序:据我所知,Visual Studio 并不像 gcc(或其链接器)那样挑剔。 @ruchir 您是否已经启用了链接器的详细模式? @J.Riesmeier 我现在启用了详细模式。现在我看到超过 3000 行的输出。这可以用来定位错误的来源吗? @Ruchir 通常,是的。这就是我推荐它的原因:) 在链接器的详细输出中,您应该能够看到哪些库从哪些目录链接到您的程序,当然,还有更多关于链接器错误的详细信息。正如您所说:输出非常冗长,因此您需要一些经验或耐心才能找到相关行。【参考方案4】:

检查你的 .lib 和 vs 平台,如果相同,例如 x64 的 lib,那么你的 vs 平台必须是 x64。

【讨论】:

是的,两个平台都是一样的。【参考方案5】:

我有同样的错误。您可以转到项目属性-> 链接器-> 输入-> 附加依赖项-> 编辑-> 在所有其他库之前添加这两个库-(netapi32.lib,wsock32.lib)。这为我解决了错误。

【讨论】:

以上是关于将 DCMTK 与 Visual Studio 一起使用时出现链接器错误 LNK2019的主要内容,如果未能解决你的问题,请参考以下文章

将差异工具与 Visual Studio 2003 集成

将 Clearcase 与 Visual Studio 2010 重新集成?

将文件类型与 Visual Studio 2003 重新关联

如何将 LocalDB 2016 与 Visual Studio 2017 一起安装?

无法将 GitLab 与 Visual Studio Code 连接

如何将 sonarqube 与 Visual Studio 解决方案集成