繁体   English   中英

静态和动态C ++库

[英]C++ Libraries, Static and Dynamic

我正在阅读有关c ++库,静态/动态库和链接的文章。 我的问题如下:

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

2)g ++的-I和-L命令是否使用过一次? 向编译器“说”这些库在哪里? 还是每次编译使用库的源代码?

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

我不太了解静态库和静态链接的含义以及动态链接的含义? 我所了解的是,使用静态库和链接是在将程序与库合并时,不需要在原始位置的原始程序吗? 对于动态,我知道的是DDl,它代表动态链接库。 那么我能想到的唯一的区别就是将DDL加载到主存储器中,但是我很困惑

有知识的人可以将我的知识(可能是错误的)置于正确的顺序并进一步解释这些术语吗?

谢谢!

假设您的代码是一个名为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.alibsomeOtherLibrary.a (正在使用的库的二进制文件)的目录的路径。 。

main.o相似libsomelibrary.alibsomeotherlibrary.a包含函数的定义(即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选项用于告诉它在哪里可以找到那些二进制文件。 这些选项不会从一个g ++调用“停留”到下一个调用(这没有意义)。


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

但是,这并不总是您想要做的。 一些库被许多不同的程序使用,并且您可以通过在程序之间共享库来节省大量空间。 这就是动态链接(即运行时)的情况。 在这种情况下,程序将仅在需要它们时提取它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM