将 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的主要内容,如果未能解决你的问题,请参考以下文章
将 Clearcase 与 Visual Studio 2010 重新集成?
将文件类型与 Visual Studio 2003 重新关联
如何将 LocalDB 2016 与 Visual Studio 2017 一起安装?