python调用c++生成的dll
前言
这个我查询了很多资料,所以到此为止,相当于做一个总结
c++代码如何生成dll
#include<iostream>
using namespace std;
extern "C" __declspec(dllexport) int add(int a,int b);
int add(int a, int b){
return a + b;
}
int main(){
cout << add(1,2) << endl;
return 0;
}
这里的 extern那一行相当于为 python提供了调用接口,如果写好函数后,一定要按照那一行的格式进行声明,否者无法进行调用。
编译命令:
g++ -shared test.cpp -o test.dll
这里的源码文件为 test.cpp,会生成 test.dll文件
python调用方法
from ctypes import *
import ctypes
dll = ctypes.cdll.LoadLibrary('test.dll')
print(s)
输出:3
调用成功
字符串传递方法
我当时想用c++实现一个加密算法,然后需要传递字符串,所以这部分才是有意思的,并且网上几乎查不到。
python 与c++互相传递字符串
由于c++存储字符串只能通过字符数组(也可以使用string类,但是由于需要与python进行交互,就必须用c支持的),所以这样写
#include<iostream>
using namespace std;
extern "C" __declspec(dllexport) int add(int a,int b);
extern "C" __declspec(dllexport) char* Rstring(char *s,int count);
int add(int a, int b){
return a + b;
}
char* Rstring(char *s,int count){
for (int i = 0; i < count; ++i)
{
cout << s[i];
}
return s;
}
int main(){
cout << add(1,2) << endl;
return 0;
}
python方面:
from ctypes import *
import ctypes
dll = ctypes.cdll.LoadLibrary('test.dll')
s = dll.Rstring(b'hello world',11)
print(s)
print(c_char_p(s).value)
这里,有一个有意思的函数 c_char_p,这个函数可以通过指针来找到指针所指向的地址中的值,也就是专门为指针准备的函数,由于c++返回的是一个指针,所以我们用到了这个函数,另外传递和传出的字符串都说 b‘’开头的,也就是字节型数据。
python调用c++生成的dll的更多相关文章
- c++调用matlab生成的Dll动态连接库
点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台: matlab 7.0(R ...
- C++调用C#生成的DLL文件的各种问题
C++调用C#生成的DLL文件: 首先选择建立一个C#的类库,然后再按照需求编写需要的函数 之后,对于C++调用过程需要注意的几点: 1.使用#using <....some.dll>指出 ...
- 示例 - 如何在NodeJS中调用SS生成的DLL
要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS中生成DLL, 请查看: S ...
- C#调用Matlab生成的Dll
问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...
- #Lua:Lua调用C++生成的DLL库
Lua调用C++生成的DLL库 本文参考了某大佬的博客,写得十分详细,推荐!!! 需求: 在之前的求解器中添加了Lua库,使得程序可以在Lua脚本中实现自定义函数功能,考虑到未来可能需要与第三方程序库 ...
- WPF开发的界面调用C++生成的dll文件
以引用d1.dll为例. [生成d1.dll] 文件——新建——项目——Visual C++——Win32项目,选择DLL,点击Finish.在d1.cpp中添加代码 #include "s ...
- php调用C#生成的dll(二)
根据上一篇博文,php调用c#生成的动态库,运行测试时报Fatal error: Class 'COM' not found in XXXXXXXXX 原因是php.ini中未开启COM组件的应用,解 ...
- Java採用JNI调用VC++生成的dll(Java与C++交互)
应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行 ...
- Qt Creator调用VS2008生成的DLL注意事项 good
问题:生成的dll文件QT无法静态/隐式调用 分析:调用的lib库可能是msvc编译的,而我用Qt调用,Qt默认编译器是minGW,两种编译器生成的函数名不一样,所以调用的时候你要用哪个函数,编译结果 ...
- WPF调用C++生成的dll文件(示例)
注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...
随机推荐
- WSL 2简介
Windows Subsystem for Linux(WSL)适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能.相比前一 ...
- 2020年12月-第01阶段-前端基础-HTML CSS 项目阶段(三)
品优购项目(三) 1. 首页制作 1). 楼层区 floor 注意这个floor 一个大盒子 包含, 不要给高度,内容有多少,算多少 2). 家用电器模块 这个模块 简单 不需要写样式 版心居中对齐 ...
- 如何在JavaScript中使用高阶函数
将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...
- 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值. 关于 FlexSPI 外设的 loo ...
- thinkphp5.1发送邮件的方法
1.安装插件 composer require phpmailer/phpmailer 2.application下的common.php文件里加上一下代码,可自己根据需求稍加修改,我用的是验证码 u ...
- aspnetcore6.0源代码编译调试
虽然编译源码折腾了几个时间(卡在restore),最后还是跑起来了aspnetcore6.0mvc源码项目,下面说步骤,前提是网络能连外,对于不能连外的懒得折腾. 第一步 电脑找个地克隆下GitHub ...
- Elastic:使用Kafka部署Elastic Stack
- 在k8s中部署前后端分离项目进行访问的两种配置方式
第一种方式 (1) nginx配置中只写前端项目的/根路径配置 前端项目使用的Dockerfile文件内容 把前端项目编译后生成的dist文件夹放在nginx的html默认目录下,浏览器访问前端项目时 ...
- Logstash:使用 Logstash 导入 CSV 文件示例
转载自:https://elasticstack.blog.csdn.net/article/details/114374804 在今天的文章中,我将展示如何使用 file input 结合 mult ...
- C#.NET ORM 如何访问 Access 数据库 [FreeSql]
最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...