### 使用GCC建立并调用静态库与动态库 在软件开发过程中,经常需要将一些功能模块封装成库供多个程序共享使用。库可以是静态库或动态库两种形式。本篇将详细介绍如何利用GCC(GNU Compiler Collection)编译器创建和使用这两种类型的库。 #### 一、静态库 静态库是在程序链接阶段被合并到最终可执行文件中的库。当程序运行时,静态库中的代码不会被加载,而是已经作为程序的一部分存在于内存中。 ##### 创建静态库 以`hellos.c`为例,首先编写一个简单的C语言源文件`hellos.c`: ```c // hellos.c #include "hellos.h" void printS(char *str) { printf("printinstaticway:%s", str); } ``` 其中`hellos.h`是头文件,用于声明函数接口: ```c // hellos.h #ifndef_HELLO_S_H #define_HELLO_S_H void printS(char *str); #endif ``` 接下来使用GCC命令来编译和创建静态库: ```bash gcc -c -o hellos.o hellos.c ar rcs libhellos.a hellos.o ``` 这里 `-c` 表示只编译并生成目标文件而不进行链接操作,`-o` 后面指定输出文件名,`ar` 是归档工具命令,`rcs` 分别代表替换、追加和创建文件,`libhellos.a` 即为创建好的静态库文件。 ##### 调用静态库 为了调用上面创建的静态库,我们需要编写一个主程序`main.c`: ```c // main.c #include <stdio.h> #include "hellos.h" int main() { char *text = "Hello World!"; printS(text); return 0; } ``` 然后使用GCC链接静态库: ```bash gcc -o hello main.c -L. -lhellos ``` 这里的 `-L.` 表示链接器搜索当前目录下的库文件,`-lhellos` 指定链接静态库`libhellos.a`。运行结果如下: ``` printinstaticway:Hello World! ``` #### 二、动态库 动态库是一种在程序运行时才被加载的库。这样做的好处是可以减少可执行文件的大小,并且方便更新。 ##### 创建动态库 以`hellod.c`为例,同样先编写一个简单的C语言源文件`hellod.c`: ```c // hellod.c #include "hellod.h" void printD(char *str) { printf("printindynamicway:%s", str); } ``` 其中`hellod.h`是头文件,用于声明函数接口: ```c // hellod.h #ifndef_HELLO_D_H #define_HELLO_D_H void printD(char *str); #endif ``` 接着使用GCC命令来编译和创建动态库: ```bash gcc -shared -o hellod.dll hellod.c ``` 这里 `-shared` 指定了生成共享库(即动态库),`hellod.dll` 是生成的动态库文件。 ##### 调用动态库 为了调用上面创建的动态库,我们同样需要编写一个主程序`main.c`: ```c // main.c #include <stdio.h> #include "hellod.h" int main() { char *text = "Hello World!"; printD(text); return 0; } ``` 然后使用GCC链接动态库: ```bash gcc -o hello main.c -L. -lhellod ``` 运行结果如下: ``` printindynamicway:Hello World! ``` 需要注意的是,在不同的操作系统中,动态库的处理方式有所不同。例如,在Windows系统中,动态库通常以`.dll`后缀命名;而在Linux等类Unix系统中,动态库通常以`.so`后缀命名。 此外,为了能够正确地加载动态库,还需要考虑动态库的搜索路径问题。在Linux下,可以通过以下几种方式设置动态库的搜索路径: 1. **在当前目录**:将动态库放在当前目录下。 2. **通过环境变量**:设置`LD_LIBRARY_PATH`环境变量,指定动态库所在的目录。 3. **修改配置文件**:编辑`/etc/ld.so.conf`文件,添加动态库所在的目录。 4. **默认路径**:系统默认会搜索`/lib`和`/usr/lib`这两个目录。 如果需要将动态库放置在非标准位置,可以在链接时使用`-Wl,-rpath=...`选项指定运行时的搜索路径。 通过以上步骤,我们可以使用GCC成功地创建并调用了静态库和动态库,这对于软件开发来说是非常有用的技能。
1.建立
/* hellos.h */
#ifndef _HELLO_S_H
#define _HELLO_S_H
void printS(char* str);
#endif
/* hellos.c */
#include "hellos.h"
void printS(char* str) {
printf("print in static way: %s", str);
}
输入命令:
gcc -c -o hellos.o hellos.c
ar cqs libhellos.a hellos.o
于是得到了libhellos.a这么一个静态链接库。
2.调用
/* main.c */
#include <stdio.h>
#include "hellos.h"
main() {
char* text = "Hello World!\n";
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助