GCC动态链接库和静态库

 

GCC动态链接库和静态库

对于一个简单的C程序:
//tt.h
void print();

//tt.c
#include <stdio.h>
#include "tt.h"
void print()
{
printf("你好 in tt.c/n");
}

//ttt.c
#include "tt.h"

int main(int argc, char *argv[])
{
print();

return 0;
}

使用:gcc -shared -o libtt.dll tt.c   生成libtt.dll;
使用:gcc ttt.c -l"tt" -L . -o ttt    生成ttt.exe。

接下来谈谈生成静态库,及其链接:
首先将tt.c编译为.o文件:gcc -c tt.c -o tt.o
然后利用ar命令将.o文件生成静态库.a文件:ar cqs libt3.a tt.o
然后链接静态库编译为exe程序:gcc ttt.c -o t3.exe -L"." -lt3
生成的t3.exe比ttt.exe稍大,但是考虑到ttt.exe还带了一个dll,t3就小多了。当然这个比较纯属无聊。
另外,生成的.a文件,改名为.lib文件也可以,利用VC的cl命令链接.a或者.lib都行,都能够得到正确的exe程序。
当然,使用VC的lib命令也可以把GCC生成的.o文件转换为.lib文件,使用ar命令可以将cl编译的.obj转换为.a或者.lib文件。

gcc test.c -ldl
虽然GCC这里生成的.a和.lib都能使用,但是动态库时如果生成.so好像是不行的

### GCC动态链接库与静态链接库的区别及用法 #### 一、基本概念 动态链接库(Dynamic Link Library, DLL静态链接库(Static Link Library, SLL)是两种不同的库文件形式。 - **静态链接库**是在编译阶段将目标代码嵌入到最终的可执行文件中的方式,生成的二进制文件独立于外部依赖项[^1]。 - **动态链接库**则是指在程序运行时加载并链接的目标代码,通常以共享对象的形式存在,在 Linux 下扩展名为 `.so`。 #### 二、主要区别 | 特性 | 静态链接库 | 动态链接库 | |---------------------|------------------------------------|------------------------------------| | 文件大小 | 较大 | 较小 | | 运行性能 | 更高 | 略低 | | 更新维护 | 不方便 | 方便 | | 加载时机 | 编译时完成 | 运行时加载 | 动态链接库虽然牺牲了一定的运行效率[^2],但由于其节省内存空间以及便于更新的特点,在现代软件开发中更为常见。 --- #### 三、使用方法对比 ##### (1)静态链接库的创建与使用 以下是创建使用静态链接库的一个简单示例: ###### 创建静态链接库 假设有一个简单的函数 `add.c`: ```c // add.c int add(int a, int b) { return a + b; } ``` 将其编译为目标文件,并打包成静态库: ```bash gcc -c add.c -o add.o ar rcs libadd.a add.o ``` ###### 使用静态链接库 编写主程序 `main.c` 并链接该静态库: ```c // main.c #include <stdio.h> extern int add(int a, int b); int main() { printf("%d\n", add(3, 5)); return 0; } ``` 编译命令如下: ```bash gcc main.c -L. -ladd -static -o static_main ``` 这里 `-static` 参数确保只使用静态库进行链接。 --- ##### (2)动态链接库的创建与使用 下面是创建使用动态链接库的过程: ###### 创建动态链接库 同样基于上述 `add.c` 文件,可以按照以下步骤构建动态库: ```bash gcc -fPIC -shared add.c -o libadd.so ``` 其中 `-fPIC` 表示生成位置无关代码,而 `-shared` 则用于指示生成共享库[^3]。 ###### 使用动态链接库 修改 `main.c` 的编译指令为: ```bash gcc main.c -L. -ladd -o dynamic_main export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./dynamic_main ``` 注意:为了使程序能够找到动态库,需设置环境变量 `LD_LIBRARY_PATH` 或者将动态库复制至标准路径如 `/usr/lib/`[^4]。 --- #### 四、总结 无论是静态还是动态链接库都有各自的适用场景。当追求更高的运行效率或希望减少对外部资源的依赖时可以选择静态链接;而在注重灵活性、节约存储空间的情况下,则更倾向于采用动态链接的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值