动态库.so如何使用

动态库(在 Linux 系统下通常以 .so 为扩展名,在 Windows 系统下以 .dll 为扩展名)的使用包含创建和在程序里调用这两个主要方面,以下将分别介绍在 Linux 和 Windows 系统中动态库的使用方法。

Linux 系统下动态库的使用

1. 创建动态库

假设有两个源文件 add.csubtract.c,它们分别实现加法和减法功能。

  • add.c
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}
  • subtract.c
#include <stdio.h>

int subtract(int a, int b) {
    return a - b;
}

使用以下命令将这两个源文件编译成动态库 libmath.so

gcc -shared -fPIC add.c subtract.c -o libmath.so
  • -shared:表示生成共享库文件。
  • -fPIC:生成位置无关代码,这对于动态库是必需的。

2. 编写使用动态库的程序

创建一个主程序 main.c 来调用动态库中的函数:

#include <stdio.h>

// 声明动态库中的函数
extern int add(int a, int b);
extern int subtract(int a, int b);

int main() {
    int result_add = add(5, 3);
    int result_subtract = subtract(5, 3);

    printf("Add result: %d\n", result_add);
    printf("Subtract result: %d\n", result_subtract);

    return 0;
}

3. 编译主程序并链接动态库

gcc main.c -L. -lmath -o main
  • -L.:指定动态库的搜索路径为当前目录。
  • -lmath:指定要链接的动态库名为 libmath.so

4. 运行程序

在运行程序之前,需要让系统知道动态库的位置。有以下几种方法:

  • 临时设置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
./main

LD_LIBRARY_PATH 是 Linux 系统用于指定动态库搜索路径的环境变量,上述命令将当前目录添加到该变量中。

  • 永久设置环境变量:可以将 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library 添加到 ~/.bashrc~/.bash_profile 文件中,然后执行 source ~/.bashrc 使设置生效。
  • 将动态库复制到系统默认搜索路径:例如 /usr/lib/usr/local/lib,不过这种方法需要管理员权限。

Windows 系统下动态库的使用

1. 创建动态库

同样使用上述的 add.csubtract.c 文件,使用 MinGW 或 Visual Studio 等工具来创建动态库。以下是使用 MinGW 的示例:

gcc -shared -o math.dll add.c subtract.c

2. 编写使用动态库的程序

创建 main.c 文件:

#include <stdio.h>
#include <windows.h>

// 定义函数指针类型
typedef int (*AddFunction)(int, int);
typedef int (*SubtractFunction)(int, int);

int main() {
    // 加载动态库
    HINSTANCE hDLL = LoadLibrary("math.dll");
    if (hDLL == NULL) {
        printf("Failed to load DLL.\n");
        return 1;
    }

    // 获取函数地址
    AddFunction add = (AddFunction)GetProcAddress(hDLL, "add");
    SubtractFunction subtract = (SubtractFunction)GetProcAddress(hDLL, "subtract");
    if (add == NULL || subtract == NULL) {
        printf("Failed to get function address.\n");
        FreeLibrary(hDLL);
        return 1;
    }

    // 调用函数
    int result_add = add(5, 3);
    int result_subtract = subtract(5, 3);

    printf("Add result: %d\n", result_add);
    printf("Subtract result: %d\n", result_subtract);

    // 释放动态库
    FreeLibrary(hDLL);

    return 0;
}

3. 编译和运行程序

使用 MinGW 编译:

gcc main.c -o main

math.dllmain.exe 放在同一目录下,然后运行 main.exe

通过以上步骤,你可以在 Linux 和 Windows 系统中创建并使用动态库。

posted @   白柒  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2024-01-24 assert用法
2024-01-24 C/C++ 常用输出流
点击右上角即可分享
微信分享提示