是的,这是一个愚蠢的问题......但是在我的两个C ++类中,我们根本没有这样做(除了本机库:iostream,iomanip等)...我的问题是任何人都可以提供链接这给出了向C ++添加库的一般解释?
我确实意识到#include意味着什么;它只是我对C ++ IDE中的链接器/目录没有任何线索。
这么长的问题简短;我可以得到用于在C ++中链接库的术语的一般解释吗?
我正在使用c :: b w / MinGW。
答案 0 :(得分:19)
This可能会让您感兴趣,但这里有一个简短的版本:
当您汇编.cpp
,.c
或任何文件时,每个翻译单元(即每个文件)都会生成一个目标文件。创建最终可执行文件时,将所有目标文件合并为一个二进制文件。对于静态库,您将静态存档(.a
或.lib
)与所有目标文件一起编译到二进制文件本身中。对于链接到动态共享对象(.so
或.dll
),通过调用全局偏移表创建二进制文件,并通知链接器您希望链接共享对象和操作系统加载程序在运行程序时构建正确的图像。
从...开始
翻译 - 这是高级代码(使用C,Fortran或其他)通过翻译单元转换为汇编代码的地方。因此,每个.cpp
文件都在内部转换为特定体系结构的程序集。
汇编 - 从生成的程序集生成目标文件。对象文件几乎是机器代码,但它们有很多“未解析的外部”,您可以将其视为指向实际函数定义的指针。
链接 - 这将获取所有目标文件,并将它们放入一个连贯的二进制文件中,无论是动态共享对象还是可执行文件。您需要告诉链接器应该在哪里找到上一阶段中所有未解析的外部因素,否则它们将在此处显示为错误。
现在二进制文件位于磁盘上,等待直到......
loader - 操作系统从磁盘加载二进制文件,其中包含构建程序映像所需的所有信息。虽然细节是特定于平台的,但加载器的任务通常是查找链接器生成的所有共享库引用,加载它们(递归地,因为每个DSO可以有自己的依赖项)并将它们放入程序的内存空间。
答案 1 :(得分:3)
这是一个很大的话题,我不想提供一个明确的答案。但是,由于您说您正在使用Code::Blocks,因此这是向项目添加库的顺序: