C/C++ 静态链接库(.a) 与 动态链接库(.so) 您所在的位置:网站首页 so的文件 C/C++ 静态链接库(.a) 与 动态链接库(.so)

C/C++ 静态链接库(.a) 与 动态链接库(.so)

2023-03-22 20:16| 来源: 网络整理| 查看: 265

平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的。但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了!

库有两种,一种是 静态链接库,一种是 动态链接库,不管是哪一种库,要使用它们,都要在程序中包含相应的 include 头文件。我们先来回顾一下程序编译的过程。如下图:

我们结合gcc指令来看一下每个阶段生成的文件:

gcc -c helloWorld.c

生成一个helloWorld.o文件,该文件是将源文件编译成的汇编文件,在链接之前,该文件不是可执行文件。而

gcc -o helloWorld helloWorld.c

生成的是一个helloWorld的执行文件,格式为ELF(与windows不一样)。该文件为链接后的可执行文件。

1、静态链接库

什么是静态链接呢?即在链接阶段,将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。该可执行文件可能会比较大。这种链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。

缺点是:文件太大,一个全静态方式生成的简单print文件都有857K。而动态链接生成的一样的可执行文件却只要8.4K。

文件内容很简单,就是一个printf("hello world!\n");

因为包含库文件stdio,所以静态编译出的文件很大。如果你想尝试的话,可以这样编译:

gcc -static -o print print.c

在linux中,静态库为lib*.a,动态库为lib*.so。

下面我们来写一个库文件,然后生成一个静态库,然后尝试着调用一下它。一个简单的add函数,头文件为

头文件对于的源文件:

下面我们来生成静态库:

输入:g++ -c add.cpp 生成.o目标文件

然后用ar命令进一步生成库libadd.a:

ar -crv libadd.a  add.o

这样就生成了一个静态链接库libadd.a。

下面我们来写一个测试文件:

#include #include "./addlib/add.h" using namespace std; int main() { int number1 = 10; int number2 = 90; cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有