【问题标题】:Visual Studio DLL Reference causing LNK2019导致 LNK2019 的 Visual Studio DLL 参考
【发布时间】:2016-12-30 11:05:15
【问题描述】:

我有一个具有一般形式的 Visual Studio 解决方案(从 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 中定义的符号。

【问题讨论】:

  • 所以这个问题在前 5 分钟被否决了两次。有人可以解释一下这个问题不令人满意或不合适的地方,而不是投反对票和逃跑吗?
  • 我没有投反对票,但我认为仅通过发布的信息无法回答这个问题。我希望它作为流行的未定义参考链接器错误问题的副本而被关闭。 stackoverflow.com/questions/12573816/…
  • 完整发布一些链接器错误。
  • @Steve,感谢您的反馈,帖子已编辑。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2016-02-18
    • 2012-11-12
    • 2023-03-10
    相关资源
    最近更新 更多