我需要帮助设置一个简单的C / C#SWIG项目 . 我很难将一个使用SWIG绑定的C项目组合在一起 . 我正在使用Visual Studio 2010和最新版本的SWIG .
我的代码很简单:
cpp_file.h:
#pragma once
class cpp_file
{
public:
cpp_file(void);
~cpp_file(void);
int times2(int arg);
};
cpp_file.cpp
#include "cpp_file.h"
cpp_file::cpp_file(void)
{
}
cpp_file::~cpp_file(void)
{
}
int cpp_file::times2(int arg)
{
return arg * 2;
}
我的SWIG界面文件是:
cpp_file.i
/* cpp_file.i */
%module cpp_file
%{
/* Put header files here or function declarations like below */
extern int times2(int arg);
%}
extern int times2(int arg);
我可以很好地编译这个项目 . 然后我运行SWIG命令来生成包装器:
swig -csharp "C:/pathToFile/cpp_file.i"
我不知道该做什么 . 我找不到任何解释Visual Studio 2010中的操作的教程或文档 .
当我将SWIG生成的* cpp_file_wrap.c *文件添加到我的Visual Studio 2010项目并尝试构建项目时,我收到两个链接器错误 .
-
错误LNK1120:1个未解析的外部
-
错误LNK2001:未解析的外部符号_times2
第一条错误消息指向我的dll文件 . 第二个错误指向某个目标文件(* .obj) . 错误消息提到“_times2”的符号无法在我的项目中找到 .
我怎样才能继续我的简单项目?是否有一些教程或一些文档逐步解释此过程?我找不到任何涉及C与SWIG,C#,Visual Studio 2010和.Net v4.0的内容 .
2 回答
完整构建VS2010 IDE的分步说明:
使用两个项目创建解决方案:
C#控制台应用程序
C Win32控制台应用程序(Name = cpp,DLL,空项目) . 如果选择其他名称,请不要在项目中使用类的名称,并更新 .i 文件
%module
name以匹配 .在C#项目中创建一个名为 Generated 的文件夹 .
将.cpp,.h和.i文件添加到DLL,并进行以下修改 .
注意必须导出整个 class . 将
<project>
替换为项目名称 . 将为您的DLL项目定义预处理器定义<project>_EXPORTS
(请参阅项目,属性,C,预处理器) .模块名称与模块中的类名称不匹配 .
%include <windows.i>
帮助SWIG了解某些"Window-isms",如__declspec
.cpp_file.h
cpp_file.i
选择
cpp_file.i
,属性,常规,项目类型为 Custom Build Tool .选择 Apply 以创建自定义构建工具属性组 .
在自定义构建工具中,常规,命令行输入:
swig -csharp -c++ -outdir GeneratedFolderPath cpp_file.i
在“输出”中,输入 cpp_file_wrap.cxx ,然后单击“确定”关闭对话框 .
右键单击
cpp_file.i
并编译 . 这应该创建四个文件:C#Generated文件夹中的三个文件和C项目中的一个文件 .在C项目中创建 Generated Files 过滤器并向其添加 cpp_file_wrap.cxx .
将三个生成的文件添加到C#项目的Generated文件夹中 .
右键单击C#项目并将C项目添加为依赖项 .
在C#项目的Properties,Build选项卡中,将输出路径从
bin\Debug
更改为..\Debug
或C Project输出目录的相对路径 . .exe和.dll需要位于同一目录中 .在C#项目的
Main
中,添加以下行:var cpp = new cpp_file();
Console.WriteLine(cpp.times2(5));
构建解决方案 .
运行C#项目 .
祝好运!如果你让它工作,请告诉我 . 我可以扩展任何不清楚的事情 .
我've only used SWIG a small amount but it looks like you'尝试在您的.i文件中导出名为
times()
的函数,该函数不存在 . 你有一个cpp_file::times()
方法,但不会导出 . 您需要定义times()
函数或通过SWIG导出整个cpp_file
类 .我会花一些时间阅读official SWIG documentation,特别是SWIG and C++部分 . 还有this question on SO,它有一些与SWIG和VS2010相关的信息 .