答案: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)#endifextern "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"#include int 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 __cplusplusextern "C" {#endifint 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"#include int 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风格或使用抽象基类。
基本上就这些。核心是定义清楚接口、正确编译生成动态库,并在调用端正确链接和部署。不复杂但容易忽略路径和导出符号的问题。
以上就是c++++怎么创建和使用动态链接库(DLL/SO)_c++动态库的创建、编译与调用方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1481676.html
微信扫一扫
支付宝扫一扫