函数不是.obj文件的一部分吗?

时间:2012-08-14 14:58:10

标签: c++

根据我正在阅读的书中说:
在检查程序语法之后,C ++编译器创建.obj文件。接下来,编译器调用链接器,该链接器将.obj文件中的程序语句与某些函数(如printf())组合在一起。

函数不是.obj文件的一部分吗?这些不是陈述吗? 链接器是否与术语“静态链接”和“动态链接”有连接?

我知道动态链接是在运行时解决的,但根据本书,链接器在编译时被调用。

2 个答案:

答案 0 :(得分:1)

.cpp中定义的功能会出现在相应的.obj中。使用但未定义的函数(如printf等标准库函数)不属于它。链接器使用其他.obj和库来解析引用。

  • 静态库只是.obj的集合,链接器接受提供所需符号的.obj并将它们放在可执行文件中;

  • 动态库未放入可执行文件中;可执行文件被标记为引用它们,并在可执行文件启动时找回它们。 (至少在它们的主要用途中,它们也可以用于插件,然后在进程要求时搜索它们。)

答案 1 :(得分:0)

从技术上讲,链接器所做的事情确实没有“动态链接”这样的东西。实际上只有在运行时手动绑定到一段代码,这实际上与链接器无关。

例如,在Windows下有一些处理dll的方法

  1. 最低级别的解决方案是使用LoadLibrary or AfxLoadLibrary按名称手动访问该函数,将它们转换为相应类型的函数指针。

  2. 您可以使用import lib。这允许链接器在链接时解析其他dll中的函数。所以你可以直接调用dll中的函数(即只是在客户端代码中说Foo())。但是,这些函数只是上面提到的LoadLibrary方法的包装器。如果没有加载,它们会加载dll,直接访问该库中的函数指针,然后执行该函数。