C语言—动态库建立

本文介绍了如何编写简单的动态库代码,包括头文件和实现文件的内容,并详细解释了使用GCC编译器进行动态库编译及链接的过程。此外,还说明了如何设置环境变量以确保动态链接库可以被正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 动态库的书写

头文件test.h:

#ifdef   TEST_H
#define  TEST_H
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b);
int Less(int a ,int b);
#endif

实现文件test.c:
#include "test.h"
int add(int a,int b){
        return  a+b;
}
int Less(int a,int b){
        return  a-b;
}
         

二、编译动态库

gcc tes.c -fPIC -shared -o libtest.so    //如果有多个.c 文件,就把所有的.c文件进行编译

隐式链接(编译时链接)
使用gcc main.c -L. -ltest -o test进行编译。
-L:添加库文件的搜索路径
-l:指定需要链接的库。该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test

在执行隐式链接的程序之前要注意设置LD_LIBRARY_PATH环境变量,或者把前面生成的libtest.so复制到系统路径下,否则会找不到动态库。
$ ./test
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=.
$ ./test

或者把编译好的动态库放到/usr/lib 中去



### 如何使用 QT 创建 C 语言 动态链接(DLL) #### 准备工作 为了创建一个适用于C语言的动态链接,在Qt环境中,首先需要设置好开发环境。这包括安装并配置好Qt Creator以及确保已经选择了支持C编译器的套件。 #### 定义导出宏 定义用于指定函数或变量是否应被导出到外部程序使用的宏是非常重要的。对于Windows平台来说,通常会采用`__declspec(dllexport)`来标记要从DLL中导出的内容;而在Linux和其他POSIX兼容系统上,则不需要特别处理即可实现相同效果。因此可以编写如下形式的头文件: ```c #ifndef MYLIBRARY_H #define MYLIBRARY_H #ifdef _WIN32 #ifdef BUILDING_MYLIBRARY #define MYLIBRARY_API __declspec(dllexport) #else #define MYLIBRARY_API __declspec(dllimport) #endif #else #define MYLIBRARY_API #endif extern "C" { MYLIBRARY_API int add(int a, int b); } #endif // MYLIBRARY_H ``` 此代码片段展示了如何通过条件编译指令适配不同操作系统下的API修饰符[^1]。 #### 编写源码 接下来就是实际的功能实现了。这里给出一个简单的加法运算作为例子: ```c #include "mylibrary.h" int add(int a, int b){ return a+b; } ``` 这段简单代码实现了两个整数相加的功能,并将其声明为可由其他应用程序访问的形式。 #### 配置 `.pro` 文件 为了让Qt能够识别这是一个共享项目而不是普通的执行程序,还需要修改`.pro`文件中的某些参数。具体做法是在其中加入以下几行内容: ```qmake TEMPLATE = lib CONFIG += dll DESTDIR = ./bin/ TARGET = myLibraryName ``` 这些选项告诉构建工具该工程是一个动态链接,并指定了输出目录和目标名称。 #### 构建与测试 完成上述步骤之后就可以尝试编译这个新建立起来的了。如果一切顺利的话应该可以在指定路径下找到生成好的`.dll`(Windows) 或者 `.so`(Unix-like systems) 文件。此时便可以通过另一个独立的应用去加载它来进行功能验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值