【问题标题】:missing .lib file, Dynamic linking confusion缺少 .lib 文件,动态链接混乱
【发布时间】:2015-03-10 18:29:50
【问题描述】:

据此question

动态链接是在运行时由操作系统完成的。

直到现在,使用 g++ 和 eclipse CDT,我静态链接了从 windows SDK 获得的 odbc32.lib,以便为我的程序获取一些 ODBC 函数。但我意外删除了该文件,惊讶地发现我的程序仍在运行并连接到数据库。由于该文件不再存在于我为 -L 选项指定的路径中,因此我认为它必须仍然存在于该路径的子文件夹之一中的某个位置。但是后来我删除了库路径以查看会发生什么,但我的程序仍然有效!我开始搜索 odbc32.lib,但我真的找不到。但是,我确实在 C:\Windows\System32 中找到了一个 odbc32.dll 文件,我认为它可能会动态链接到我的程序。

  • 如果我是对的,当我从未将 C:\Windows\System32 指定为我的库路径时,编译器如何找到 odbc32.dll?
  • 为了验证我的理论,我开始在 system32 文件夹中抓取许多 .dll 文件并使用 -llibrary 链接它们。由于我的程序运行成功,我已经成功链接了一些我得到的文件,但是链接器找不到一些文件,这是为什么呢?

我说的对吗?这是动态链接的例子吗?

注意:我还从路径中删除了 C:\Windows\System32,但由于某种原因,它仍然可以正常工作。

【问题讨论】:

  • 您检查过您的%PATH% 是否包含C:\Windows\System32?此外,在 Windows 上,编译时需要 .lib 文件进行链接,但之后在运行时需要 .dll,除非库被专门编译为静态。
  • @rhodysurf 是 %PATH% 包括 C:\Windows\System32。但是我刚刚删除了它,但它仍然有效!您说“在 Windows 上,编译时链接需要 .lib 文件” - 所以您的意思是它不应该在没有它的情况下编译?有没有办法找到 g++ 从哪里获取库?
  • 是的,除非您将一个库链接到另一个库
  • @rhodysurf 是的,你的意思是我可以找出编译器从哪里获取它所链接的库?
  • 不,我的意思是它不应该在没有 lib 的情况下编译。当它使用g++ -v 编译时,您应该能够看到它链接到的内容。我不确定其他在 Windows 上执行此操作的方法

标签: c++ linker g++ eclipse-cdt


【解决方案1】:

从您的 cmets 中,您说您正在使用 g++cygwin。基本上这意味着链接现在已经完成,就像在 linux(或 unix 或其他)上一样,并且需要一个库。在您的情况下,这是静态库,因此它会在编译时链接并且不再需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2018-06-23
    • 2019-10-08
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多