c++ - 如何在 Visual Studio 2010 中使用 SWIG 创建 DLL

标签 c++ python visual-studio-2010 swig

几周以来,我一直在尝试让 Microsoft Visual Studio 2010 使用 SWIG 为我创建一个 DLL。如果你已经经历过这个过程,你会不会好心给一个深思熟虑的一步一步的过程解释?我在网上到处找,花了很多时间尝试这样做;但是我发现的所有教程都已过时或解释不清。

我已经用 cygwin 成功地完成了这个过程;但正如你们中的一些人所知,cygwin DLL 不是很实用。

因此,我有 .i、.cpp 和 .h 文件,我知道它们可以一起创建一个 DLL。我只需要知道如何使用 Visual Studio C++ 2010 做到这一点。我的目标语言是 Python。

最佳答案

分步说明。这假设您拥有源代码并且正在构建一个将源代码直接链接到其中的单个 DLL 扩展。创建一个工作项目后我没有回顾它,所以我可能错过了一些东西。如果您卡在某个步骤上,请评论此帖子。如果您有一个现有的 DLL 并希望创建一个包装它的 Python 扩展 DLL,则此步骤略有不同。如果您在这篇文章的评论方面需要帮助,我会扩展它。

Edit 8/19/2012:如果从 C 示例开始,请不要在步骤 13 中使用 -c++ 并使用 .c 而不是 .cxx 用于步骤 14 和 19 中的包装文件扩展名。

  1. 启动 Visual Studio 2010
  2. 现有代码中的文件、新建、项目...
  3. 选择“Visual C++”项目类型并点击下一步。
  4. 输入 .cpp/.h/.i 文件所在的项目文件位置。
  5. 对于项目名称,选择 .i 文件中 %module 语句中使用的名称(大小写很重要)。
  6. 选择项目类型“动态链接库(DLL)项目”并点击下一步。
  7. 将 Python.h 文件的路径添加到包含搜索路径,通常类似于“C:\Python27\include”,然后点击下一步。
  8. 点击完成。
  9. 在解决方案资源管理器中右键单击项目,添加,现有项...,然后选择您的 .i 文件。
  10. 右键单击 .i 文件、属性,然后选择配置“所有配置”。
  11. 将项目类型更改为“自定义构建工具”并点击应用。
  12. 在 Properties 中选择“Custom Build Tool”(它会出现在上面的 Apply 之后)。
  13. 输入“swig -c++ -python -outdir $(Outdir) %(Identity)”的命令行(假设 SWIG 在您的路径中,并根据需要将生成的 .py 文件重定向到 Debug 或 Release 目录)。
  14. 在输出中输入“%(Filename)_wrap.cxx;$(Outdir)%(Filename).py”。
  15. 点击确定。
  16. 右键单击 .i 文件,然后选择编译。
  17. 右键单击项目,添加,新建过滤器,将其命名为“生成的文件”。
  18. 右键单击“Generated Files”,单击“Properties”,将“SCC Files”设置为“False”(如果您使用源代码控制,这会阻止 VS2010 尝试在此过滤器中检入生成的文件)。
  19. 右键“Generated Files”,Add,Exiting Item,选择编译生成的_wrap.cxx文件。
  20. 右键单击项目,属性。
  21. 选择配置“所有配置”。
  22. 选择配置属性、链接器、常规、附加库目录并添加 python 库的路径,通常为“C:\Python27\libs”。
  23. 选择配置属性、常规并将 TargetName 设置为“_$(ProjectName)”。
  24. 将目标扩展名设置为“.pyd”。
  25. 构建项目的“发布”版本。除非您构建 Python 本身的调试版本,否则您无法构建调试版本。
  26. 打开控制台,进入项目的Release目录,运行python,导入你的模块,调用函数!

关于c++ - 如何在 Visual Studio 2010 中使用 SWIG 创建 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11693047/

相关文章:

python - 使用 SciPy 曲线拟合指数函数

c# - 如何处理 ReSharper 的名称建议?

visual-studio-2010 - 我的 CSS 水平菜单显示 :block perfectly, 但在子目录中看起来完全不同

c++ - 读取文本文件获取奇怪的值,获取无限值输出

c++ - 在 C++ 中打开一个文件,相对的还是绝对的?

c++ - SFML2 与 mingw32 : undefined references 的静态链接错误

c++ - 为什么我的 C++ 实现比 R 源代码慢?

Python:多次逐行迭代.txt文件

c++ - 在 x64 系统上从 32 位应用程序使用 IFilter

python - 我如何使这个测试通过?