当前位置: 首页 > news >正文

mingw64 动态库的制作与使用

工程目录

PS C:\Users\PC\CLionProjects\my_add> tree /F                                     
├─cmake-build-debug
│  ├─bin
│  │      libmy_add.dll
│  │      python_dll_tets.py
│  CMakeLists.txt
└─src│  main.cpp└─libmy_lib.cppmy_lib.h

main.cpp

#include "./lib/my_lib.h"  // 包含 DLL 的头文件
#include <iostream>
int main() {// 调用 DLL 中的函数int result = add(2, 3);  // 假设 DLL 中定义了 add 函数std::cout << "2 + 3 = " << result << std::endl;print_hello();  // 假设 DLL 中定义了 print_hello 函数return 0;
}

lib/my_lib.h

#ifndef MY_LIB_H
#define MY_LIB_H// MinGW 兼容的导出/导入声明
#ifdef _WIN32
// 编译 DLL 时定义 MY_LIB_EXPORTS,启用导出
#ifdef MY_LIB_EXPORTS
#define MY_LIB_API __declspec(dllexport)
#else
#define MY_LIB_API __declspec(dllimport)
#endif
#else
#define MY_LIB_API
#endif// 强制 C 语言命名规则(避免 MinGW32 C++ 编译的名字修饰)
#ifdef __cplusplus
extern "C" {
#endif// 32位环境下明确指定 int 为 32位(与 MinGW32 兼容)
MY_LIB_API int __cdecl add(int a, int b);  // __cdecl 是 MinGW32 默认调用约定
MY_LIB_API void __cdecl print_hello();#ifdef __cplusplus
}
#endif#endif // MY_LIB_H

lib/my_lib.cpp

#include "my_lib.h"
#include <iostream>int add(int a, int b) {return a + b;
}void print_hello() {std::cout << "Hello from dynamic library!" << std::endl;
}

CMakeLists.txt

# 最低 CMake 版本要求
cmake_minimum_required(VERSION 3.10)#是否动态库
set(CON_IS_BUILD_DLL 1)# 项目名称
project(my_add)# 设置 C++ 标准(可选,根据需要调整)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 输出
if(${CON_IS_BUILD_DLL})# 定义动态库:指定源码文件add_library(${PROJECT_NAME} SHAREDsrc/lib/my_lib.cppsrc/lib/my_lib.h  # 可选,方便 IDE 识别)else ()add_executable(${PROJECT_NAME}src/lib/my_lib.hsrc/lib/my_lib.cppsrc/main.cpp
)
endif()# 设置动态库输出路径(可选,默认在 build 目录)
set_target_properties(${PROJECT_NAME} PROPERTIESLIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib  # Linux/macOSRUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin  # Windows(.dll 属于可执行文件类别)
)# 安装配置(可选,用于系统级安装)
install(TARGETS ${PROJECT_NAME}LIBRARY DESTINATION src  # Linux/macOS: /usr/local/src 等RUNTIME DESTINATION bin  # Windows: 安装目录/bin
)
install(FILES src/my_lib.h DESTINATION include)  # 安装头文件

python_dll_tets.py

import os
import ctypes# 1. 修正 MinGW 路径(用 raw 字符串,避免斜杠问题)
mingw_bin = r"D:\Program Files (x86)\Dev-Cpp\mingw64\bin"  # 去掉末尾的 /,用 \ 分隔
os.environ["PATH"] = mingw_bin + ";" + os.environ["PATH"]# 2. 明确 DLL 路径(不要用 ./,直接写绝对路径或相对于脚本的路径)
# 假设 Python 脚本和 libmy_add.dll 在同一目录:
dll_path = os.path.join(os.path.dirname(__file__), "libmy_add.dll")
# 若不在同一目录,写绝对路径:
# dll_path = r"C:\Users\PC\CLionProjects\my_add\cmake-build-debug\bin\libmy_add.dll"# 3. 先检查 DLL 文件是否存在
if not os.path.exists(dll_path):print(f"❌ DLL 文件不存在!实际路径:{dll_path}")
else:class MyAdd(object):def __init__(self, dll_path):try:# MSVC/VC++ 编译# windll.LoadLibrary(dll_path)#MinGW/GCC 编译self.dll = ctypes.CDLL(dll_path)self._init_functions()print("✅ DLL 加载成功!")except Exception as e:print(f"❌ 加载 DLL 失败: {e}")def _init_functions(self):# 声明 add 函数self.add = self.dll.addself.add.argtypes = [ctypes.c_int, ctypes.c_int]self.add.restype = ctypes.c_int# 声明 print_hello 函数self.print_hello = self.dll.print_helloself.print_hello.argtypes = []self.print_hello.restype = None# 测试if __name__ == "__main__":my_add = MyAdd(dll_path)if hasattr(my_add, 'add'):print(f"2 + 3 = {my_add.add(2, 3)}")if hasattr(my_add, 'print_hello'):my_add.print_hello()
✅ DLL 加载成功!
2 + 3 = 5
Hello from dynamic library!
http://www.dtcms.com/a/532767.html

相关文章:

  • webrtc代码走读(八)-QOS-FEC-flexfec rfc8627
  • Linux内核RDMA连接管理(CMA)驱动深度解析:高性能网络的基石
  • 网站建设网站自助建设wordpress迁移安装
  • [sam2图像分割] 提示编码器 | PositionEmbeddingRandom
  • 晋江网站建设联系电话迁安做网站中的cms润强
  • 【图像处理基石】图像匹配技术:从原理到实践,OpenCV实现与进阶方向
  • JavaScript性能优化:reduce方法的巧妙运用
  • Go语言数组和切片
  • 静安做网站公司wordpress 做社区
  • SVD分解在MIMO系统中的应用:从信道建模到信号恢复
  • chp03【组队学习】Post-training-of-LLMs
  • 网站建设大神级公司北京网站建设价位
  • HCIE云计算题超长解析
  • MobaXterm 全面使用指南:从入门到高效运维
  • 律师网站模板wordpress建站侵权
  • 昆明网站设计制作公司如何注册微信公众平台账号
  • 深入浅出 SSE:实现服务器向客户端的单向实时通信
  • Datawhale AI夏令营--构建一个面向应急管理领域的智能问答系统task2
  • 论gRPC:基于 TCP/IP 的通用网络模式,以及基于 Unix Domain Sockets (UDS) 的同机进程间通信 (IPC) 模式
  • C语言习题~day27
  • AI之智能体agent与dify的搭建
  • 哪个网站可以接图纸做哪个行业建设网站的需求多
  • 做微信的网站叫什么米WordPress多重筛选功能
  • C++与Python:内存管理与指针的对比
  • 辽宁专业模板网站建设公司网站开发顶岗周记
  • X红书AI发布助手 - 自动化内容创作与发布工具
  • html5网站建设中模板网站改版 seo
  • 第十章:生态篇 - 构建您的第一个插件生态
  • 大模型MCP原理及实践
  • Keil 5 找不到编译器 Missing:Compiler Version 5