【问题标题】:How to correctly handle dependencies of static libraries?如何正确处理静态库的依赖关系?
【发布时间】:2013-03-28 13:00:52
【问题描述】:

我有一个项目LibA,它是一个静态库,使用第三方库Lib3。 LibA 项目的构建和执行都很好。

我有另一个项目 Exe,它是一个可执行文件并使用 LibA。这可以编译,但链接器找不到来自 Lib3 的函数,这些函数仅在 LibA 中使用。

我尝试过的事情:

  • 将 Lib3 的位置添加到项目 Exe 中的库目录路径中(与 LibA 中引用 Lib3 的方式相同)
  • 将 Lib3 的位置添加到链接器的附加库目录中
  • 将 Lib3 *.lib 文件复制到项目 LibA 的输出文件夹(因此包含 LibA *.lib 文件)

无论我尝试什么,我仍然会收到LNK2019: Unresolved external symbol。只有当我在 LibA 中删除实际调用 Lib3 的代码时,我才能正确编译和链接项目 Exe。

如何正确处理静态库的依赖关系?

编辑:需要澄清的一些代码:

LibA 包含 LibA.h 和 LibA.cpp:

LibA.h:

class LibA {
    void doSomething();
}

LibA.cpp:

#include "LibA.h"
#include "Lib3.h"

void LibA::doSomething() {
    //call stuff in Lib3.h
}

Exe.cpp:

#include "LibA.h"

int _tmain(int argc, _TCHAR* argv[])
{
   LibA a = new LibA();
   a.doSomething();
}

【问题讨论】:

  • 您是否已将Exe 项目路径添加到Lib3 库?我认为依赖项不是“继承的”,所以在链接Exe 时,编译器应该知道Lib3 的路径,即使它没有明确使用(但我可能错了,这就是为什么这是一个注释,而不是答案)
  • 是的,我在Exe中添加了Lib3库的路径。同样的问题。
  • 您是否也添加了库名称Lib3?不只是路径?
  • 好吧,在 Visual Studio 设置中我只能添加包含库的目录。这样做足以让 LibA 链接到 Lib3

标签: c++ visual-studio-2010 static-libraries


【解决方案1】:

尝试使用 Visual Studio 的 dumpbin 来查看 lib3.lib 是否导出了您需要的函数。 如果不这样做,您需要在 lib3.h 和 __declspec(dllexport) 中声明您的函数,以使它们对尝试链接到您的库的其他模块可见。

【讨论】:

  • 我可以从我的 LibA 链接到 Lib3 就好了。只有当我从 Exe 链接到 LibA 时才会出现问题,而后者又链接到 Lib3
猜你喜欢
  • 2021-08-27
  • 2012-12-14
  • 2011-06-06
  • 2017-04-08
  • 2018-05-17
  • 2011-02-13
  • 2013-12-21
  • 2015-05-11
  • 2021-12-14
相关资源
最近更新 更多