当前位置:首页 > C++ > 正文

C++动态库开发入门(手把手教你创建和使用.so共享库)

在C++开发中,C++动态库(也称为共享库)是一种非常重要的代码复用方式。它允许你将常用功能打包成一个独立的文件,在多个程序中共享使用,而无需重复编译源码。本教程将从零开始,详细讲解如何在Linux系统下创建、编译并使用C++动态库(.so文件),即使是编程小白也能轻松上手。

C++动态库开发入门(手把手教你创建和使用.so共享库) C++动态库 共享库开发 动态链接库教程 创建.so文件 第1张

什么是C++动态库?

动态库(Dynamic Library),在Linux中通常以 .so(Shared Object)为扩展名,在Windows中则是 .dll。与静态库不同,动态库在程序运行时才被加载,多个程序可以同时使用同一个动态库文件,节省内存和磁盘空间。

常见的共享库开发场景包括:插件系统、模块化架构、跨项目功能复用等。

第一步:编写C++源代码

我们先创建一个简单的数学工具库,包含加法和乘法两个函数。

创建头文件 math_utils.h

// math_utils.h#ifndef MATH_UTILS_H#define MATH_UTILS_H#ifdef __cplusplusextern "C" {#endif// 声明加法函数int add(int a, int b);// 声明乘法函数int multiply(int a, int b);#ifdef __cplusplus}#endif#endif // MATH_UTILS_H

注意:使用 extern "C" 可避免C++名称修饰(name mangling),使动态库更容易被其他语言调用。

接着创建实现文件 math_utils.cpp

// math_utils.cpp#include "math_utils.h"int add(int a, int b) {    return a + b;}int multiply(int a, int b) {    return a * b;}

第二步:编译生成动态库

使用g++编译器将源码编译为动态库。关键参数是 -fPIC(生成位置无关代码)和 -shared(生成共享库)。

在终端执行以下命令:

g++ -fPIC -shared -o libmath_utils.so math_utils.cpp

成功后,你会在当前目录看到 libmath_utils.so 文件。这就是你的动态链接库教程中要创建的核心产物!

第三步:编写测试程序并链接动态库

创建一个测试程序 main.cpp 来验证动态库是否可用:

// main.cpp#include <iostream>#include "math_utils.h"int main() {    int sum = add(5, 3);    int product = multiply(4, 7);    std::cout << "5 + 3 = " << sum << std::endl;    std::cout << "4 * 7 = " << product << std::endl;    return 0;}

编译测试程序时,需要链接动态库:

g++ -o main main.cpp -L. -lmath_utils

解释:

  • -L.:告诉链接器在当前目录查找库文件
  • -lmath_utils:链接名为 libmath_utils.so 的库(去掉前缀 lib 和后缀 .so

第四步:运行程序

直接运行 ./main 可能会报错:“error while loading shared libraries: libmath_utils.so: cannot open shared object file”。

这是因为系统找不到动态库。解决方法有三种:

  1. 临时方案:设置环境变量
    export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
  2. 永久方案:将库路径加入 /etc/ld.so.conf 并运行 sudo ldconfig
  3. 开发方案:将库复制到系统目录如 /usr/local/lib

执行第一种方法后,再运行程序:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH./main

输出应为:

5 + 3 = 84 * 7 = 28

总结

通过本教程,你已经掌握了如何进行创建.so文件的完整流程:从编写头文件和实现文件,到编译生成动态库,再到链接和运行测试程序。这种C++动态库技术是构建大型软件系统的基础技能之一。

建议你动手实践一遍,加深理解。后续还可以学习如何使用CMake自动化构建动态库,或在Windows下使用Visual Studio创建DLL文件。

祝你编程愉快,早日成为C++高手!