本次操作使用的工具为VSCode+MinGW书写代码并编译为静态库。
1.准备测试代码
首先,准备一些简单的排序代码。代码结构如下所示:

头文件位置在include文件夹中,sort.h包含所有排序方法的声明。print.h简单包含一个数组打印功能。对应的排序实现代码在sort文件夹中的对应代码文件中。项目的主函数在两个文件夹的目录test1中。test.cpp是写排序方法时的简单测试代码。
在准备好这些代码之后,便开始编译静态库的操作。
2.静态库的基本操作
在Linux系统中,静态链接库的命名时lib<name>.a(lib + 库名称加文件后缀的格式)。
生成静态链接库的命令是:ar rcs libfun.a fun2.o fun2.o。
使用静态链接库的命令是:gcc main.c -L<dir> -lfun 或gcc main <dir>/libfun.a
3.在样例中的生成方法
要生成静态链接库,首先需要把源码编译成二进制(.o)文件。对应的操作是:
首先将目录切换至sort目录中。在VSCode的终端输入cd sort切换操作路径。
编译源码至二进制文件的命令为:g++ -c -I ../include *.cpp(此处直接将所有源代码一次性编译为二进制文件,直接使用通配符*配置所有cpp文件,有需要可以自行设计对应命令)。编译后的结果如下:

此时 ,所有的源代码都已经被编译成二进制文件。现在就到了将这些二进制文件打包生成静态库的时候了。不改变路径的情况下输入命令:ar rcs libsort.a *.o即可按照命名规则生成名为libsort.a的静态库文件。ar命令后面的参数意思是:
r[ab][f][u] - replace existing or insert new file(s) into the archive如果输入r代表如果在对应目录下已经有了同名的.a文件便替换它,如果没有则直接生成对应的.a文件。
[c] - do not warn if the library had to be created输入c表示如果不存在.a文件则直接生成,不需要打印日志询问是否生成等信息。
[s] - create an archive index (cf. ranlib)输入s表示创建索引,即.a文件内部会有一个txt文件作为这个静态库的索引。
处理好的静态库.a文件如下所示:

此处可以看出ar命令实际上是一个归档整理的命令。s命令生成的索引文件为1.txt打开后可以发现如下内容:

现在,需要使用我们做好链接的静态库链接主函数了。想要将静态链接库链接到主函数,需要先将主函数编译成二进制.o文件。在当前目录输入cd ..退出sort目录回到根目录中,随即输入二进制文件编译命令g++ -c -I include -finput-charset=UTF-8 -fexec-charset=GBK main.cpp 其中需要包含include文件夹下的头文件,并给出输入文件主函数的编码方式UTF-8,后将输出文件的编码方式GBK给出以防止乱码的发生。
这步完成后,使用生成的.o文件链接静态库继续输入g++ main.o -o main sort\libsort.a进而生成可执行文件main.exe。调用exe文件则可以展示出整体测试功能输出结果如下:

另外,链接静态库还有另外一种方法。将主目录下生成的.o .exe文件删除后重新对主函数进行编译生成.o文件(其实可以用之前的.o文件没有影响)。在获取.o文件后使用命令g++ main.o -o main -L sort -l sort 便可以链接静态库到主函数。其中前面的生成命令不需要解释。后面的-L表示链接库所在的路径,-l表示链接库的名称,此处的名称不需要写全称libsort.a仅需要前后缀省略后的库名称sort。生成的可执行文件执行后的结果同之前的方法一样,如下所示:

至此,生成静态库以及在GCC中静态库的两种调用方法已经完成。
1万+

被折叠的 条评论
为什么被折叠?



