答案:C++中动态库在Windows下用DLL、Linux下用SO实现,需分别使用__declspec(dllexport)和-fPIC/-shared编译,导出函数建议用extern "C"避免命名修饰,调用时需正确链接导入库并配置路径。

在C++中创建和使用动态链接库(Windows下为DLL,Linux下为SO)是模块化开发的重要手段。它能让代码复用、更新更灵活,同时减少可执行文件体积。下面分别介绍在Windows和Linux环境下如何创建与调用C++动态库。
一、Windows下创建和调用DLL
1. 创建DLL项目
使用Visual Studio或命令行工具均可。以Visual Studio为例:
- 新建“动态链接库(DLL)”项目。
- 添加头文件mylib.h和源文件mylib.cpp。
2. 编写导出函数
立即学习“C++免费学习笔记(深入)”;
在mylib.h中声明要导出的函数,使用__declspec(dllexport)标记:
#ifdef MYLIB_EXPORTS #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif extern "C" MYLIB_API int add(int a, int b);
在mylib.cpp中实现函数:
#include "mylib.h"
int add(int a, int b) {
return a + b;
}
注意:extern "C"防止C++命名修饰,便于C/C++调用。
3. 编译生成DLL
- 编译后会生成mylib.dll和对应的mylib.lib(导入库)。
- .lib用于链接,.dll运行时需放在可执行文件目录或系统路径中。
4. 调用DLL
新建一个可执行项目,包含mylib.h,链接mylib.lib,并将mylib.dll放到输出目录。
调用代码示例:
#include "mylib.h" #includeint main() { std::cout << "5 + 3 = " << add(5, 3) << std::endl; return 0; }
在项目属性中添加附加依赖库:mylib.lib,并设置包含目录。
二、Linux下创建和调用SO
1. 编写源码
创建mylib.h和mylib.cpp,内容与上面类似,无需__declspec:
#ifndef MYLIB_H
#define MYLIB_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
2. 编译生成SO
使用g++编译:
g++ -fPIC -shared -o libmylib.so mylib.cpp
-
-fPIC:生成位置无关代码。 -
-shared:生成共享库。
3. 调用SO
编写主程序main.cpp:
#include "mylib.h" #includeint main() { std::cout << "5 + 3 = " << add(5, 3) << std::endl; return 0; }
编译并链接SO:
g++ main.cpp -L. -lmylib -o main
-
-L.:指定库搜索路径(当前目录)。 -
-lmylib:链接libmylib.so。
运行前需确保系统能找到SO文件:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main
三、跨平台注意事项
若希望代码跨平台,可用宏处理差异:
#ifdef _WIN32 #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API #endif
导出类时也类似,但要注意STL对象跨库传递可能引发问题,建议接口保持C风格或使用抽象基类。
基本上就这些。核心是定义清楚接口、正确编译生成动态库,并在调用端正确链接和部署。不复杂但容易忽略路径和导出符号的问题。











