gcc生成和使用cpp动态_静态链接库教程

⌚Time: 2022-03-17 22:20:48

👨‍💻Author: Jack Ge

c++库分为动态库与静态库,它们的区别是

使用动态库在编译时不将代码编译进程序,在程序里只有一个“指向”的位置,当需要相应功能的代码时会从动态库中调用,因此程序的运行需要动态库的支持。而使用静态库在编译时直接将相关功能代码编译进程序。所生成的程序能够独立运行,不依赖任何库。

动态库特点:

静态库特点:


测试文件

模块a源文件,包含一个函数

moduleA.cpp


#include<stdio.h>

void print_hello(){

    puts("hello!");

}

模块b源文件,包含一个类

moduleB.cpp


#include<stdio.h>

#include"moduleB.h"

void cTest::function(){

    puts("this is cTest::function");

}

模块b的头文件(包含模块b中的类声明)

moduleB.h


class cTest{

    public:

    void function();

};

为了方便的使用这两个模块中的函数及类,为它们编写一个头文件

headerAB.h


//包含模块b的头文件,其中有模块b中的所有类声明

#include"moduleB.h"

void print_hello();

在main函数中,包含headerAB.h头文件,使用A,B模块中的函数及类。

main.cpp


#include"headerAB.h"

int main(){

    print_hello();

    cTest ct;

    ct.function();

    return 0;

}

编译环境:gcc-4.7.2


动态库

生成

方式一


g++ -fpic -shared 源文件名... -o 动态链接库名

在linux中,动态库后缀名是.so,而windows是.dll

方式二

生成目标文件


g++ -c -fpic 源文件名

生成动态库文件


g++ -shared 目标文件 -o 动态库名称

使用


g++ 源文件 库文件 -o 程序

若出现程序不能运行的问题,是因为找不到相应的动态库。需要将动态库文件拷贝到系统动态链接库文件夹,如windows的C:\Windows\System32文件夹,程序所在目录下,linux的/lib文件夹等。再运行程序即可


静态库

生成

生成目标文件


g++ -c 源文件

将目标文件生成静态库


ar rcs 静态库名称 目标文件

在linux中,静态库后缀名是.a,而windows是.lib。并且静态链接库的名称遵循特定规则

对于linux静态库名字格式为libxxx.a

对于windows静态库名字格式为libxxx.lib

其中xxx为起的静态库名字

使用

gcc默认进行动态编译,加入-static参数通知编译器进行静态编译

方式一


g++ -static 源文件 静态库文件 -o 程序

注意:静态库文件的顺序是在源文件之后,否则链接出错

方式二


g++ -static 源文件 -L 静态库所在目录 -l静态库名


1.有时候想将程序功能给别人用,又不想公开源代码,就可以考虑将源文件编译成库文件,同时给别人提供相关的一组头文件

例如上面测试的文件,编译成库后,只需要将生成的动态/静态库文件、headerAB.hmoduleB.h,交给对方就可以了

2.头文件(.h)只是对函数,变量,类的声明,而源文件(.cpp)才是模块真正实现的部分。

3.有时候会在链接环节出错:找不到对应的符号,可能是包含了头文件,在vs项目文件中未包含源文件就不会进行编译。或者,由于库目录和名称错误没有链接到库文件。或者头文件中对符号进行了声明,未在源文件中进行实现。