【发布时间】: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