BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1462|回复: 3

[经验分享]在blender里用py导入c/c++ 编译的dll

[复制链接]
发表于 2015-2-27 16:56:28 | 显示全部楼层 |阅读模式
本帖最后由 imdjs 于 2015-2-27 18:23 编辑

关于用python 导入c/c++编译的dll ,在网上也可以找到相关教程,在这里分享一下我的经验。
我这里介绍在windows7 x64里用python的ctypes模块导入dll的例子,不同操作系统设置略有不同,为了简单明白,这里直接只用脚本形式导入,就不加入addon的界面了。
先准备 cpp文件:我这里命名为TestDLL64.cpp
  1. #include <stdio.h>
  2. #define EX   extern"C"  __declspec(dllexport)   //如果是C++代码用这个显式的定义dll接口
  3. //#define EX  __declspec(dllexport)  //如果是C代码用这个显式的定义dll接口

  4. EX int Add(int i,int j)  //定义相加函数
  5. {
  6. return i+j;
  7. }

  8. EX int Multipy(float f,int j)  //定义相乘函数
  9. {
  10. return f*j;
  11. }
复制代码

然后用编译器把上面的代码编译成dll动态库 放到c盘。(根据需要你可以放到任何地方)
因为这里的dll相对简单,我通常结合vc12 用命令行直接在notepad++里编译。
这里介绍一下notepad++里的编译命令行,如果你用vs2013编译可以忽略这个。先配置npp的编译环境
在npp的运行里输入命令
setx PATH "%PATH%;(Program Files)\Microsoft Visual Studio 12.0\VC\bin\amd64;"这是定义vc12的cl.exe 与link.exe 的文件位置,如果你的vs2013安装在其它盘,路径也要作相应调整,在npp里会直接调用这两个exe。
然后重启npp。

以下在npp里编译dll的命令行
  1. SET DIRECTORY="C:"
  2. cmd /k chdir /d "$(CURRENT_DIRECTORY)"   &cl  "$(FILE_NAME)"  /GS /TP    /c      &link   /SUBSYSTEM:WINDOWS /MACHINE:X64  /DLL "$(NAME_PART)".obj  /OUT:$(DIRECTORY)\$(NAME_PART)64.dll   &EXIT
复制代码


SET DIRECTORY="C:"表示 把编译后的文件目录放在C盘,DIRECTORY 是一个在npp里的自定义变量,/TP 表示编译为C++,如果要编译为C 就应改成/TC ,/DLL表示编译为dll动态库,还有其它参数这里在就不详细说明了,可以参考msdn里的命令行说明。
把以上命令行代码填写到npp的 QQ截图20150227162734.jpg QQ截图20150227162826.jpg
  按ok键,然后会在c盘生成  一个TestDLL64.dll 的文件

再准备 py文件:
  1. from ctypes import *
  2. from ctypes.wintypes import *

  3. DLL = CDLL("C:\\TestDll64.dll") #用ctypes导入刚才编译的dll文件
  4. print (DLL);#如果导入成功 这里会打印出信息
  5. i=8
  6. f=2.56
  7. cf=c_float(f)  #在ctypes里 如果要在函数的参数里导入一个float类型必须先这样转换,如果是int 或bool 类型就不用
  8. DLL.Multipy.restype = c_float #定义在C++里Multipy 函数的输出类型为float,如果输出类型为int 或bool 类型就不用 这样显式定义
  9. add=DLL.Add(i, 6) #运行C++里的Add函数
  10. print (add)
  11. mul=DLL.Multipy(cf, i) #运行C++里的Multipy函数
  12. print (mul)

  13. windll.kernel32.FreeLibrary.argtypes = [HMODULE]
  14. windll.kernel32.FreeLibrary(DLL._handle);#释放内存的dll 这样的话 可以更新编译dll 而不用退出blender
复制代码



在blender的脚本编辑器里运行以上脚本会打印出
QQ截图20150227165107.jpg
说明导入dll模块成功。
这里这个例子比较简单,其实还可以用py导入 用blender 的源码编译的dll ,这样可以把一些只在源码里的功能打包成dll 用到addon里。







发表于 2015-3-19 09:30:29 | 显示全部楼层
非常有价值的关键突破口,感谢分享!
回复 支持 反对

使用道具 举报

发表于 2015-3-25 16:56:39 | 显示全部楼层
感谢分享!

http://www.swineworld.org/2014/0 ... ns-for-blender.html  副一篇老外的方法。需要翻墙

点评

py调用 dll有很多种方式,老外的方法 应该是c扩展的方式。  详情 回复 发表于 2015-3-30 11:59
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-30 11:59:22 | 显示全部楼层
kidux 发表于 2015-3-25 16:56
感谢分享!

http://www.swineworld.org/2014/04/native-python-extensions-for-blender.html  副一篇老外 ...

py调用 dll有很多种方式,老外的方法 应该是c扩展的方式。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-12-13 00:50 , Processed in 0.019079 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表