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项目类型:空项目 ...
随机推荐
- 国产CPLD(AGM1280)试用记录——做个SPI接口的任意波形DDS [原创www.cnblogs.com/helesheng]
我之前用过的CPLD有Altera公司的MAX和MAX-II系列,主要有两个优点:1.程序存储在片上Flash,上电即行,保密性高.2.CPLD器件规模小,成本和功耗低,时序不收敛情况也不容易出现.缺 ...
- JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
一.前言 在多线程的场景下,我们会经常使用加锁,来保证线程安全.如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题.也可以使用Condition的awai ...
- 使用 Dockerfile 的一些最佳实践
- Minio VS Ceph
文章转载自:https://blog.csdn.net/Moolight_shadow/article/details/123204412
- Python Client API文档
官网文档地址:http://docs.minio.org.cn/docs/master/python-client-api-reference 初使化MinIO Client对象 from minio ...
- Elasticsearch:Dynamic mapping
Elasticsearch最重要的功能之一是它试图摆脱你的方式,让你尽快开始探索你的数据. 要索引文档,您不必首先创建索引,定义映射类型和定义字段 - 您只需索引文档,那么index,type和fie ...
- Docker目录/var/lib/docker/containers文件太大
Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加,本篇来了解一些控制日志文件的方法. 查出占用磁盘较大的文件 Docker 的日志文 ...
- Node Exporter监控指标
访问http://localhost:9100/metrics,可以看到当前node exporter获取到的当前主机的所有监控数据,如下所示: 每一个监控指标之前都会有一段类似于如下形式的信息: # ...
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit
Cockpit 是一个基于 Web 的服务器管理工具,可用于 CentOS 和 RHEL 系统.最近发布的 CentOS 8 和 RHEL 8,其中 cockpit 是默认的服务器管理工具.它的软件包 ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...