如何在Visual Studio 2010中构建这个简单的C++/SWIG/C#项目?

use*_*135 10 c++ swig visual-studio-2010 c#-4.0

我需要帮助设置一个简单的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);
};
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我的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);
Run Code Online (Sandbox Code Playgroud)

我可以很好地编译这个项目.然后我运行SWIG命令来生成包装器:

swig -csharp "C:/pathToFile/cpp_file.i"
Run Code Online (Sandbox Code Playgroud)

我不知道该做什么.我找不到任何解释Visual Studio 2010中的操作的教程或文档.

当我将SWIG生成的*cpp_file_wrap.c*文件添加到我的Visual Studio 2010项目并尝试构建项目时,我收到两个链接器错误.

  1. 错误LNK1120:1个未解析的外部
  2. 错误LNK2001:未解析的外部符号_times2

第一条错误消息指向我的dll文件.第二个错误指​​向某个目标文件(*.obj).错误消息提到"_times2"的符号无法在我的项目中找到.

我怎样才能继续我的简单项目?是否有一些教程或一些文档逐步解释此过程?我找不到任何涉及使用SWIG,C#,Visual Studio 2010和.Net v4.0的C++的东西.

Mar*_*nen 19

完整构建VS2010 IDE的分步说明:

  1. 使用两个项目创建解决方案:
    • C#控制台应用程序
    • C++ Win32控制台应用程序(Name = cpp,DLL,空项目).如果选择其他名称,请不要在项目中使用类的名称并更新.i文件%module名以匹配.
  2. 在名为Generated的C#项目中创建一个文件夹.
  3. 将.cpp,.h和.i文件添加到DLL中,并进行以下修改.
    • 请注意,必须导出整个类.替换<project>为项目名称.将为<project>_EXPORTS您的DLL项目定义预处理器定义(请参阅项目,属性,C++,预处理器).
    • 模块名称与模块中的类名称不匹配.
    • %include <windows.i>帮助SWIG理解某些"Window-isms"之类的__declspec.

cpp_file.h

#pragma once

#ifdef <project>_EXPORTS
#define <project>_API __declspec(dllexport)
#else
#define <project>_API __declspec(dllimport)
#endif

class <project>_API cpp_file
{
public:
    cpp_file(void);
    ~cpp_file(void);

    int times2(int arg);
};
Run Code Online (Sandbox Code Playgroud)

cpp_file.i

%module cpp

%{
#include "cpp_file.h"
%}

%include <windows.i>
%include "cpp_file.h"
Run Code Online (Sandbox Code Playgroud)
  1. 选择cpp_file.i,属性,常规,项目类型作为自定义生成工具.
  2. 选择" 应用"以创建"自定义生成工具"属性组.
  3. 在自定义生成工具,常规,命令行中输入:
    swig -csharp -c ++ -outdir GeneratedFolderPath cpp_file.i
  4. 在"输出"中,输入cpp_file_wrap.cxx,然后单击"确定"关闭对话框.
  5. 右键单击cpp_file.i并编译.这应该创建四个文件:C#Generated文件夹中的三个文件和C++项目中的一个文件.
  6. 在C++项目中创建生成文件过滤器并向其添加cpp_file_wrap.cxx.
  7. 将三个生成的文件添加到C#项目的Generated文件夹中.
  8. 右键单击C#项目并将C++项目添加为依赖项.
  9. 在C#项目的属性,生成标签,更改从输出路径bin\Debug..\Debug或任何到C++项目输出目录的相对路径..exe和.dll需要位于同一目录中.
  10. 在C#项目中Main,添加以下行:
    var cpp = new cpp_file();
    Console.WriteLine(cpp.times2(5));
  11. 构建解决方案.
  12. 运行C#项目.

祝好运!如果你让它工作,请告诉我.我可以扩展任何不清楚的事情.