C ++库,静态和动态

时间:2014-05-22 19:40:23

标签: c++ dll shared-libraries static-libraries

我正在阅读一篇关于c ++库和静态/动态库以及链接的文章。 我的问题如下:

1)我们必须编译要插入库中的文件,然后使用命令ar -crsv创建库文件? (是必须以lib开头并以.a结尾的存档吗?)

2)g ++的命令-I和-L一次使用?到"说"编译器在哪里?或者每次编译使用库的源代码?

3)必须使用#include<>?包含Libray如果是的话是什么名字?

我不太清楚静态库和静态链接的含义以及动态链接的含义是什么? 我所理解的是,使用静态库和链接是指我们将程序与库合并,以便在原始位置不需要原始库? 对于Dynamic,我所知道的是代表动态链接库的DDl。那么我能想到的这个DDL的唯一区别是加载到主内存中,但我很困惑

任何有知识的人都可以把我的 - 可能是错的 - 知识正确的顺序并解释更多这个术语吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

让我们说你的代码是一个名为main.cpp的文件,如下所示:

#include<headerFromSomeLibrary>
#include<headerFromSomeOtherLibrary>

int main()
{
    int var = functionFromTheLibrary();
    int otherVar = functionFromTheOtherLibrary();

    return var + otherVar;
}

编译将分两步进行。

首先,您将使用如下命令将 main.cpp 编译到目标文件中:

g++ -o main.o -c main.cpp -IheaderDirectory

其中 main.o 是将生成的目标文件的名称, headerDirectory 包含中包含的头文件的目录的路径main.cpp中

为了能够检查你的语法是否正确,编译器需要知道在 main.cpp 中调用的类和函数,但在那里没有定义,看起来像(在此例如,那些来自库,但如果它们是由你在另一个文件中定义的,它的工作原理相同)。

这就是#include指令的用武之地:它们指向包含被调用函数声明的头文件,并允许编译器完成其工作。如果声明位于名为 headerFromSomeLibrary.h 的头文件中,则相应的指令将为:

#include<headerFromeSomeLibrary>

此时,生成的文件(main.o)包含 main.cpp 中定义的函数的低级版本(在这种情况下只有 main() )。它还包含许多符号,允许识别 main.cpp 中定义并由 main.cpp 调用的函数。


第二步是连接步骤。链接命令将如下所示:

g++ -o myProgram main.o -LsomeDirectory -lsomelibrary -lsomeotherlibrary

其中 myProgram 是您要为可执行文件指定的名称, headerDirectory 是包含头文件的目录的路径, someDirectory 是包含 libsomeLibrary.a libsomeOtherLibrary.a (您正在使用的库的二进制文件)的目录的路径。

main.o 类似, libsomelibrary.a libsomeotherlibrary.a 包含函数的定义(即中使用的函数的定义) em> main()),以及标识它们的符号。链接步骤的作用是使用符号将函数定义连接到函数调用。

如果库中的函数已在myfunctions.h文件中声明并在myfunctions.cpp中定义,编译说明将如下所示:

g++ -o main.o -c main.cpp
g++ -o myfunctions.o -c myfunctions.cpp
g++ -o myProgram main.o myfunctions.o

基本上,-I选项用于告诉编译器缺少标头的位置,-l选项告诉它缺少二进制文件的名称,-L选项告诉它可以找到这些二进制文件的位置。这些选择不会停留在&#34;从一个g ++的调用到下一个(它没有意义)。


现在,您询问了静态和动态链接之间的区别。我上面解释的实际上是静态(即编译时)链接。在静态链接的情况下,编译器将获取它在库中所需的函数定义,并将它们添加到最终的可执行文件中。这很好,因为您的可执行文件不需要任何其他工作,并且因为您的编译器将能够在获取函数后进行优化。

然而,这并不总是你想要做的。一些库被许多不同的程序使用,您可以通过在程序之间共享库来节省大量空间。这就是在动态(即运行时)链接的情况下发生的情况。在这种情况下,程序将在需要时简单地获取库。