【问题标题】:Using a DLL that links to a static lib使用链接到静态库的 DLL
【发布时间】:2011-05-21 04:41:27
【问题描述】:

我正在尝试在 Visual C++ 中构建一个解决方案,其中我有一个引用我创建的 DLL 项目的前端项目。在 DLL 项目中,我链接到具有静态对象和定义的静态库(我还没有编写)。一切正常,但我有链接问题。

我有几个问题。首先,我应该只为我在前端引用的未导出的对象获取未解析的符号,对吗?我希望 DLL 成为静态库的唯一接口,并且不直接在前端引用它的任何部分,但我从这个库中得到了许多未解析的符号。有些符号似乎是#included,并且至少有一些不是由 DLL 项目直接链接的。我怀疑它与静态库中的静态声明有关,但我该如何处理这些?

一些未解决的符号错误:

2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: __thiscall SharkException::SharkException(char const *,int,char const *)" (??0SharkException@@$$FQAE@PBDH0@Z)
2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: static class Bernoulli Rng::coinToss" (?coinToss@Rng@@2VBernoulli@@A)
2>AnalysisVis.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall ChromosomeT<bool>::operator<(class Chromosome const &)const " (??M?$ChromosomeT@_N@@$$FUBE_NABVChromosome@@@Z)

【问题讨论】:

标签: c++ dll static-libraries


【解决方案1】:

导出的符号被破坏。如果静态库是使用与您正在使用的编译器不同的编译器(或编译器版本)编译的,则您的应用程序期望看到的符号可能是在静态库中使用不同的名称修饰方案定义的。您可以使用以下命令获取静态库中使用的名称修饰,然后将其与错误消息中的名称进行比较:

>pushd <path_to_msvc_dir>\Microsoft Visual Studio X.0\VC\bin
>dumpbin /all [static_lib_path] > out.txt
>type out.txt | find /I "SharkException"
>type out.txt | find /I "coinToss"
>type out.txt | find /I "ChromosomeT"

顺便说一句,使用静态库的 DLL 是否可以使用与您的应用程序/解决方案相同的编译器进行干净编译?

【讨论】:

  • 是的,DLL 项目是与应用程序相同的解决方案的一部分,它首先编译干净。
  • 另外,我尝试按照您的建议进行操作,但在静态库中找到以下内容:AD ??0SharkException@@QAE@PBDH0@Z, C9BCC4 ?coinToss@Rng@@2VBernoulli@@A,但我在那里找不到 ChromosomeT 符号。为什么这三个都出现了?我该怎么办?
  • 符号出现在库中,因为它们是在那里定义的。我猜你的 DLL 的导出函数使用这些符号但不导出它们——因此你的问题。 dll 接口可能通过依赖它们的 DLL 定义的对象间接使用这些符号——这可能很难追踪。如果您的 dll 编译干净,那么修改可能不是问题。你可以开始从你的 DLL 接口中删除东西以找出有问题的对象是什么吗?一旦你找到它,你可以用一个纯 DLL 对象替换它,你应该没问题。
  • 我现在注意到 lib 中定义的 SharkException 构造函数与您的应用程序用来引用它的方式不同。这可能是个问题,但是由于您无法对 lib 中的符号损坏方式做太多事情,因此您应该继续从 DLL 接口中删除所有 lib 符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2022-01-02
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多