静态库和动态库的生成和编译

Posted joker D888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态库和动态库的生成和编译相关的知识,希望对你有一定的参考价值。

静态库和动态库的生成和编译

静态库

  1. 头文件应该与源代码文件放在同一目录下,或者使用 -I 选项指定头文件的路径。

  2. 在编译源代码文件时,应该使用 -I 选项指定头文件的路径。例如:

    g++ -c myfile.cpp -o myfile.o -I./include
    

    上面的命令将 myfile.cpp 编译为 myfile.o,并使用 -I 选项指定头文件的路径为 ./include

  3. 在打包静态库文件时,应该将包含头文件的目录一起打包进去。例如:

    ar rcs libmylib.a myfile1.o myfile2.o include/
    

    上面的命令将 myfile1.omyfile2.oinclude/ 目录一起打包成一个名为 libmylib.a 的静态库文件。

  4. 在编译调用静态库的程序时,也应该使用 -I 选项指定头文件的路径,并且需要链接生成的静态库文件。例如:

    g++ myprog.cpp -o myprog -I./include -L/usr/local/lib -lmylib
    

    上面的命令将 myprog.cpp 编译为 myprog,并使用 -I 选项指定头文件的路径为 ./include,使用 -L 选项指定静态库的路径为 /usr/local/lib,使用 -l 选项指定静态库的名称为 mylib

动态库

  1. 编写源代码文件,并将其保存为 .cpp 文件。例如,假设有两个源代码文件 foo.cppbar.cpp,它们分别实现了两个函数 foo()bar()

  2. 将源代码文件编译成目标文件(.o 文件)。在编译时,需要加上 -fPIC 选项,以便生成位置无关的代码(Position Independent Code)。例如:

    g++ -c -fPIC foo.cpp -o foo.o
    g++ -c -fPIC bar.cpp -o bar.o
    

    上面的命令将 foo.cppbar.cpp 分别编译为 foo.obar.o

  3. 将目标文件链接成动态库文件。使用 g++ 命令的 -shared 选项可以将多个目标文件链接成一个动态库文件。例如:

    g++ -shared -o libmylib.so foo.o bar.o
    

    上面的命令将 foo.obar.o 链接成一个名为 libmylib.so 的动态库文件。

  4. 在编译调用动态库的程序时,需要使用 -L 选项指定动态库文件的路径,使用 -l 选项指定动态库的名称。例如:

    g++ myprog.cpp -o myprog -L/path/to/lib -lmylib
    

    上面的命令将 myprog.cpp 编译为 myprog,并使用 -L 选项指定动态库文件的路径为 /path/to/lib,使用 -l 选项指定动态库的名称为 mylib。注意,这里不需要指定头文件的路径,因为动态库已经包含了所有需要的符号信息。

注:

在编译时,如果同时有静态库和动态库,编译器会优先使用动态库。这是因为动态库是在运行时加载的,可以提供更大的灵活性和可重用性。如果编译器无法找到动态库,或者动态库不可用,编译器会尝试使用静态库。在链接时,如果同时存在静态库和动态库的符号定义,编译器会优先使用动态库中的符号定义。如果符号定义只存在于静态库中,则会使用静态库中的符号定义。

静态库和动态库的区别

静态库和动态库是两种不同的代码库,它们之间的区别主要在于如何链接和加载代码。

静态库是一组目标文件(Object File)的集合,它们被打包成一个单独的文件。在编译时,静态库的代码被复制到可执行文件中,使得可执行文件包含了所有需要的代码。因此,静态库在链接时会增加可执行文件的大小,但是可以避免对库的依赖性。每次修改静态库的源代码,都需要重新编译整个可执行文件。

动态库也是一组目标文件的集合,但是它们被打包成一个单独的共享库文件,扩展名为.so(Linux) 或 .dll(Windows)。在编译时,可执行文件只包含对动态库的引用,而不是复制动态库的代码。在运行时,操作系统会将动态库加载到内存中,多个程序可以共享同一个动态库,从而减少内存占用和磁盘空间。每次修改动态库的源代码,只需要重新编译动态库本身,不需要重新编译可执行文件。

总的来说,使用静态库可以简化构建过程,但是会增加可执行文件的大小;使用动态库可以节省内存和磁盘空间,但是需要保证库文件的可用性,并且在链接时需要正确地引用库文件。

以上是关于静态库和动态库的生成和编译的主要内容,如果未能解决你的问题,请参考以下文章

静态库和动态库的生成和编译

gcc编译工具生成动态库和静态库之一----介绍

动态链接库和静态链接库的区别

Linux下gcc生成和使用静态库和动态库详解

请教关于linux中静态库与动态库的问题

详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别