Dr.*_*mer 2 c++ dll shared-libraries static-libraries
我正在阅读一篇关于c ++库和静态/动态库和链接的文章.我的问题如下:
1)我们必须编译要插入到库中的文件,然后使用命令ar -crsv创建库文件?(是必须以lib开头并以.a结尾的存档吗?)
2)g ++的命令-I和-L一次使用?向编译器"说"到哪里是库?或者每次编译使用库的源代码?
3)必须使用#include <>包含Libray?如果是的话用什么名字?
我不太了解静态库和静态链接的含义以及动态链接的含义是什么?我所理解的是,使用静态库和链接是指我们将程序与库合并,以便在原始位置不需要原始库?对于Dynamic,我所知道的是代表动态链接库的DDl.那么我能想到的这个DDL的唯一区别是加载到主内存中,但我很困惑
任何有知识的人都可以把我的 - 可能是错的 - 知识变成正确的顺序并解释更多这个术语吗?
谢谢!
我们假设您的代码是一个名为main.cpp的文件,如下所示:
#include<headerFromSomeLibrary>
#include<headerFromSomeOtherLibrary>
int main()
{
int var = functionFromTheLibrary();
int otherVar = functionFromTheOtherLibrary();
return var + otherVar;
}
Run Code Online (Sandbox Code Playgroud)
编译将分两步进行.
首先,您将使用如下命令将main.cpp编译为目标文件:
g++ -o main.o -c main.cpp -IheaderDirectory
Run Code Online (Sandbox Code Playgroud)
其中main.o是将要产生的目标文件的名称和headerDirectory路径到包含包括在头文件的目录的main.cpp.
为了能够检查你的语法是否正确,编译器需要知道在main.cpp中调用但在那里没有定义的类和函数是什么样的(在这种情况下,那些来自库,但它如果它们是由您在另一个文件中定义的,则工作方式相同).
这就是#include指令的用武之地:它们指向包含被调用函数声明的头文件,并允许编译器完成其工作.如果声明位于名为headerFromSomeLibrary.h的头文件中,则相应的指令将为:
#include<headerFromeSomeLibrary>
Run Code Online (Sandbox Code Playgroud)
此时,生成的文件(main.o)包含main.cpp中定义的函数的低级版本(在本例中仅为main()).它还包含许多符号,允许识别main.cpp中定义并由main.cpp调用的函数.
第二步是链接步骤.链接命令将如下所示:
g++ -o myProgram main.o -LsomeDirectory -lsomelibrary -lsomeotherlibrary
Run Code Online (Sandbox Code Playgroud)
其中myProgram是您要为可执行文件指定的名称,headerDirectory是包含头文件的目录的路径,someDirectory是包含libsomeLibrary.a和libsomeOtherLibrary.a(您正在使用的库的二进制文件)的目录的路径.
与main.o类似,libsomelibrary.a和libsomeotherlibrary.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
Run Code Online (Sandbox Code Playgroud)
基本上,-I选项用于告诉编译器缺少标头的位置,-l选项告诉它丢失的二进制文件的名称,-L选项告诉它可以找到这些二进制文件的位置.这些选项不会"停留"从一次g ++调用到下一次调用(这没有意义).
现在,您询问了静态和动态链接之间的区别.我上面解释的实际上是静态(即编译时)链接.在静态链接的情况下,编译器将获取它在库中所需的函数定义,并将它们添加到最终的可执行文件中.这很好,因为您的可执行文件不需要任何其他工作,并且因为您的编译器将能够在获取函数后进行优化.
但是,这并不总是你想要做的.一些库被许多不同的程序使用,您可以通过在程序之间共享库来节省大量空间.这就是动态(即运行时)链接的情况.在这种情况下,程序将在需要时简单地获取库.
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |