导致LNK2019的Visual Studio DLL参考

时间:2016-08-23 14:40:13

标签: c++ visual-c++ dll visual-studio-2015 linker-errors

我有一个可视化工作室解决方案(由Qt项目生成,但我不知道它是相关的)具有一般形式:

Application.exe(取决于):
图书馆A(依赖于):
图书馆B。

我在所有库中都使用了英特尔MKL库,并让visual studio MKL插件处理这些库与我的项目的链接。我一直在构建库作为静态库,这有用,但它给了我数千个重复的定义警告:

1>mkl_intel_thread_dll.lib(mkl_intel_thread.dll) : warning LNK4006: __NULL_IMPORT_DESCRIPTOR already defined in mkl_intel_lp64_dll.lib(libimalloc.dll); second definition ignored
1>mkl_intel_thread_dll.lib(mkl_intel_thread.dll) : warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library
1>mkl_core_dll.lib(mkl_core.dll) : warning LNK4006: sdttrsb_4dfl already defined in mkl_intel_lp64_dll.lib(_sdttrsb_4dfl_lp64.obj); second definition ignored
1>mkl_core_dll.lib(mkl_core.dll) : warning LNK4006: sdttrfb_4dfl already defined in mkl_intel_lp64_dll.lib(_sdttrfb_4dfl_lp64.obj); second definition ignored
etc...

我会忽略这些警告,但是有太多这些警告会大大减慢构建过程。

因此,我将库更改为.dll,认为它将摆脱重复的定义警告(它确实如此),但它在我的库之间引发了链接器错误,如下所示:

2>metricsmodel.obj : error LNK2019: unresolved external symbol "public: class QSharedPointer<class QVector<double> > __cdecl SpectralImage::GetWaveNumbers(void)" (?GetWaveNumbers@SpectralImage@@QEAA?AV?$QSharedPointer@V?$QVector@N@@@@XZ) referenced in function "public: void __cdecl MetricsModel::RunMetrics(class MetricsRunConfig *)" (?RunMetrics@MetricsModel@@QEAAXPEAVMetricsRunConfig@@@Z)
2>metricsmodel.obj : error LNK2019: unresolved external symbol "public: __cdecl Hyperslab::Hyperslab(class QVector<int>,class QVector<int>,class QObject *)" (??0Hyperslab@@QEAA@V?$QVector@H@@0PEAVQObject@@@Z) referenced in function "public: void __cdecl MetricsModel::RunMetrics(class MetricsRunConfig *)" (?RunMetrics@MetricsModel@@QEAAXPEAVMetricsRunConfig@@@Z)
2>metricsmodel.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl Hyperslab::~Hyperslab(void)" (??1Hyperslab@@UEAA@XZ) referenced in function "private: class QVector<class QString> __cdecl MetricsModel::ComputeMetrics(class QVector<class QSharedPointer<class Metric> >,class HDFDataset *,class Hyperslab *)" (?ComputeMetrics@MetricsModel@@AEAA?AV?$QVector@VQString@@@@V?$QVector@V?$QSharedPointer@VMetric@@@@@@PEAVHDFDataset@@PEAVHyperslab@@@Z)

其中metricsmodel.obj来自库A,未解析的符号位于库B中。

在尝试将我的构建从静态库转换为.dll时,是否有一个错过的步骤?所有其他依赖项都得到满足,因此我不确定为什么库A无法在链接中找到库B中定义的符号。

1 个答案:

答案 0 :(得分:0)

对不起,这是其他地方的答案。当从静态库更改为dll时,我需要在我想要从DLL共享的所有符号上添加_declspec指令。