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

C++;静态和动态库 我正在阅读一篇关于C++库和静态/动态库和链接的文章。 我的问题如下:,c++,dll,shared-libraries,static-libraries,C++,Dll,Shared Libraries,Static Libraries,1) 我们必须编译要插入到库中的文件,然后使用命令ar-crsv来创建库文件?(是必须以lib开头并以.a结尾的归档文件?) 2) g++的命令-I和-L只使用一次?要向编译器“说”,库在哪里?还是每次编译的源代码都利用了库 3) 图书馆必须使用#包含?如果是,用什么名字 我不太明白什么是静态库和静态链接,什么是动态链接? 我所理解的是,使用静态库和链接时,我们将一个程序与库合并,这样就不需要原始库,在原始位置? 对于动态,我知道的是DDl,它代表动态链接库。那么我能想到的唯一区别就是DDL被加

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

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

3) 图书馆必须使用#包含?如果是,用什么名字

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

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


谢谢大家!

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

#include<headerFromSomeLibrary>
#include<headerFromSomeOtherLibrary>

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

    return var + otherVar;
}
其中main.o是将生成的对象文件的名称,headerDirectory是指向包含main.cpp中头文件的目录的路径

为了能够检查语法是否正确,编译器需要知道在main.cpp中调用但未在那里定义的类和函数是什么样子(在本例中,这些类和函数来自库,但如果它们是由您在另一个文件中定义的,则其工作原理相同)

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

#include<headerFromeSomeLibrary>
其中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
基本上,-I选项用于告诉编译器缺少的头在哪里,-l选项用于告诉它缺少的二进制文件的名称,-l选项用于告诉它在哪里可以找到这些二进制文件。这些选项不能“停留”在g++的一个调用到下一个调用之间(这没有意义)


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


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

您指的是g++并将问题标记为“dll”。你在Windows中使用g++吗?这都是非常特定于工具链的。不,我在Linux上,但文章中有一点是关于动态链接的,这是DDL的快捷方式。太棒了!谢谢,我明天会再次检查您的解释,然后再检查验收按钮。
g++ -o myProgram main.o -LsomeDirectory -lsomelibrary -lsomeotherlibrary
g++ -o main.o -c main.cpp
g++ -o myfunctions.o -c myfunctions.cpp
g++ -o myProgram main.o myfunctions.o