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

11

我需要帮忙搭建一个简单的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项目中并尝试构建该项目时,出现了两个链接错误:

  1. error LNK1120: 1 unresolved externals
  2. error LNK2001: unresolved external symbol _times2

第一个错误消息指向我的dll文件。第二个错误指向某个对象文件(*.obj)。错误消息提到的符号"_times2"在我的项目中找不到。

我该如何进行简单项目呢?是否有一些教程或文档可以逐步解释这个过程?我找不到任何涉及C++、SWIG、C#、Visual Studio 2010和.Net v4.0的内容。

2个回答

21

完全在VS2010 IDE中构建的逐步说明:

  1. 创建一个解决方案并添加两个项目:
    • C#控制台应用程序
    • C++ Win32控制台应用程序(名称=cpp,DLL,空项目)。如果选择其他名称,请勿使用项目中的类名,并更新.i文件中的%module名称以匹配。
  2. 在C#项目中创建名为Generated的文件夹。
  3. 向DLL添加您的.cpp、.h和.i文件,并进行以下修改。
    • 注意必须导出整个类。将<project>替换为项目名称。您的DLL项目中已经定义了预处理器定义<project>_EXPORTS(请参见“项目”、“属性”、“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);
};

cpp_file.i

%module cpp

%{
#include "cpp_file.h"
%}

%include <windows.i>
%include "cpp_file.h"
  1. 选择 cpp_file.i,属性,常规,项目类型为 自定义生成工具
  2. 选择 应用 以创建自定义生成工具属性组。
  3. 在自定义生成工具中,常规,命令行输入:
    swig -csharp -c++ -outdir GeneratedFolderPath cpp_file.i
  4. 在输出中,输入 cpp_file_wrap.cxx,并单击“确定”关闭对话框。
  5. 右键单击cpp_file.i并编译。这将创建四个文件:三个在C#生成文件夹中,一个在C++项目中。
  6. 在C++项目中创建一个名为 生成文件 的筛选器,并将 cpp_file_wrap.cxx 添加到其中。
  7. 将三个生成的文件添加到C#项目的生成文件夹中。
  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#项目。

祝你好运!如果有不清楚的地方,欢迎向我提问。


成功了!谢谢Mark。我在确保我的输出目录正确(步骤#9)时遇到了一些麻烦。我收到了一个错误消息,说我的DLL无法加载。当我修复了我的输出目录后,它就起作用了。此外,在第一步#3中,第三个项目符号,我认为您的意思是输入“%include <windows.i>可以帮助SWIG”。cpp_file.i有<windows.i>,所以这不是真正的问题。再次感谢。 - user1214135

0

我只使用过一点SWIG,但看起来你正在尝试在你的.i文件中导出一个名为times()的函数,但实际上它并不存在。你确实有一个cpp_file::times()方法,但它没有被导出。你需要定义times()函数或通过SWIG导出整个cpp_file类。

我建议花些时间阅读官方SWIG文档,特别是SWIG和C++部分。还有这个SO问题,其中包含与SWIG和VS2010相关的一些信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接