根据我正在阅读的书,它说:
在检查程序语法后,C++ 编译器会创建 .obj 文件。接下来,编译器调用链接器,将 .obj 文件中的程序语句与一些函数(如 printf())结合起来。
函数不是 .obj 文件的一部分吗?它们不是陈述吗?
链接器是否与术语“静态链接”和“动态链接”有联系?
我知道动态链接是在运行时解决的,但是根据这本书,链接器是在编译时调用的。
根据我正在阅读的书,它说:
在检查程序语法后,C++ 编译器会创建 .obj 文件。接下来,编译器调用链接器,将 .obj 文件中的程序语句与一些函数(如 printf())结合起来。
函数不是 .obj 文件的一部分吗?它们不是陈述吗?
链接器是否与术语“静态链接”和“动态链接”有联系?
我知道动态链接是在运行时解决的,但是根据这本书,链接器是在编译时调用的。
您定义的函数.cpp
存在于相应的.obj
. 使用但未定义的函数(例如标准库函数,如printf
)不是其中的一部分。链接器解决与其他.obj
和库的引用。
静态库只是一个集合,.obj
链接器采用.obj
提供所需符号的集合并将它们放入可执行文件中;
动态库没有放在可执行文件中;可执行文件被标记为引用它们,并在可执行文件启动时找到它们。(至少在它们的主要用途中,它们也可以用于插件,然后在进程要求它们时搜索它们)。
从技术上讲,实际上没有链接器完成的“动态链接”之类的事情。实际上只有在运行时手动绑定到一段代码,这与链接器无关。
例如,在 Windows 下,有几种处理 dll 的方法
最低级别的解决方案是使用LoadLibrary 或 AfxLoadLibrary按名称手动访问函数,将它们转换为适当类型的函数指针。
您可以使用导入库。这允许链接器在链接时解析其他 dll 中的函数。所以你可以直接调用dll中的一个函数(即只Foo()
在客户端代码中说)。但是,这些函数只是上述LoadLibrary
方法的包装。如果未加载,它们会加载 dll,直接访问该库中的函数指针,然后执行该函数。