【问题标题】:How to check the static library dependencies in Windows?如何检查 Windows 中的静态库依赖项?
【发布时间】:2020-03-30 15:33:32
【问题描述】:

我在一个大型项目中有这样的依赖:

MyEXE --> MyDLL --> MyStaticLib

这意味着我的可执行文件 (MyEXE) 依赖于 dll (MyDLL),而 dll 使用静态库 (MyStaticLib)。问题是我可以从MyEXE 调用MyStaticLib 方法,它编译和链接没有任何问题。我检查了 MyEXE 项目的 Visual Studio (2015) 上的 Linker/Input 页面,但我找不到 MyStaticLib 作为 MyEXE 的依赖项之一。

现在的问题是:

  1. MyEXE 怎么可能在没有任何显式依赖的情况下调用 MyStaticLib 方法?
  2. Windows 上是否有任何工具可以列出可执行文件使用的所有静态库? (这里是a solution for Linux

更新 1: MyStaticLib 的标头中没有 #pragma comment(lib, ...) 指令。因此,静态库无法使用此指令链接到 .exe。

【问题讨论】:

  • 在编译完 dll 并且没有构建 .exe 之后,您是否尝试从驱动器中删除静态库并查看是否仍然生成可执行文件?
  • 如果它是一个 static 库,它将被批发到使用它的其他(动态)库中。没有运行时动态依赖。这就是静态库的全部
  • @drescherjm 我会检查的。
  • 一个 dll 将包含静态库。但是我认为它不应该将它暴露给可执行文件,这意味着如果需要直接使用它,可执行文件还应该链接到静态库。

标签: c++ windows dll static-libraries


【解决方案1】:

MSVC 至少有一种隐式依赖机制,通过 #pragma comment(lib, ...) 指令完成。检查静态库的头文件,确保没有。

此外,如果使用通过“vcpkg”提供的静态库并且您已完成“vcpkg 集成安装”,则会将 MSBuild 文件添加到项目构建系统中,该系统会自动导入 vcpkg 生成的所有内容。

另外,link.exe 有一个 /VERBOSE:LIB 选项,可以打印出搜索的库,但它不会告诉您为什么将特定库添加到构建中。

【讨论】:

  • 链接器属性页中有一个选项,称为Link Library Dependencies。是不是表示当这个选项设置为Yes时,.exe会自动链接到依赖的.lib文件?
  • 链接库依赖选项导致项目链接任何引用的项目(至少只要源项目没有设置“忽略导入库”选项),但还有其他方法指定库(链接器->输入页面上的“附加依赖项”行,#pragma comment(lib, ...) 是直接指定 .lib 文件的常用方法)。由于#pragma comment(lib, ...) 和构建系统可以导入其他文件的方式,它并不总是可以从属性页中确定要链接的内容。
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多