首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态和动态的C++库

静态和动态的C++库
EN

Stack Overflow用户
提问于 2014-05-22 19:40:23
回答 1查看 873关注 0票数 3

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

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

2)使用-I命令和-L of g++命令一次?要对编译器“说”,库在哪里?还是每次都在编译利用库的源代码?

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

我不太明白什么是静态库和静态链接,什么是动态链接?我真正理解的是,对于静态库和链接是当我们合并一个程序与库,这样就不需要原来的一个,在原来的位置?对于动态链接库,我知道的是DDl,它代表动态链接库。那么,对于这个DDL,我唯一能想到的区别就是加载到主内存中,但是我很困惑。

有知识的人能把我的--可能是错误的--知识整理成正确的顺序,并解释更多的这个术语吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-22 21:10:54

假设您的代码是一个名为main.cpp的文件,如下所示:

代码语言:javascript
复制
#include<headerFromSomeLibrary>
#include<headerFromSomeOtherLibrary>

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

    return var + otherVar;
}

汇编将分两个步骤进行。

首先,使用如下命令将main.cpp编译成一个对象文件:

代码语言:javascript
复制
g++ -o main.o -c main.cpp -IheaderDirectory

其中main.o是将要生成的对象文件的名称,headerDirectory是指向包含在main.cpp中的头文件的目录的路径。

为了能够检查语法是否正确,编译器需要知道哪些类和函数是在main.cpp中调用的,而不是在那里定义的(在本例中,这些类和函数来自库,但如果它们是由您在另一个文件中定义的)。

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

代码语言:javascript
复制
#include<headerFromeSomeLibrary>

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

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

代码语言:javascript
复制
g++ -o myProgram main.o -LsomeDirectory -lsomelibrary -lsomeotherlibrary

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

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

如果库中的函数是在myfunctions.h s.h文件中声明并在myfunctions.cpp中定义的,编译指令应该如下所示:

代码语言:javascript
复制
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++的一个调用“停留”到下一个调用(这是没有意义的)。

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

然而,这并不总是你想要做的。有些库被许多不同的程序使用,通过在程序间共享库可以节省大量的空间。这就是动态(即运行时)链接的情况。在本例中,当程序需要库时,程序将简单地获取它们。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23815769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档