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

标签 c++ visual-studio-2010 c#-4.0 swig

我需要帮助来设置一个简单的 C++/C# SWIG 项目。我很难将使用 SWIG 绑定(bind)的 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 接口(interface)文件是:

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. 错误 LNK1120:1 个 Unresolved external 问题
  2. 错误 LNK2001:无法解析的外部符号 _times2

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

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

最佳答案

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

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

cpp_文件.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_文件.i

%module cpp

%{
#include "cpp_file.h"
%}

%include <windows.i>
%include "cpp_file.h"
  1. 选择 cpp_file.i , Properties, General, Item Type 作为Custom Build Tool
  2. 选择应用创建自定义构建工具属性组。
  3. 在自定义构建工具、常规、命令行中输入:
    swig -csharp -c++ -outdir GeneratedFolderPath cpp_file.i
  4. 在输出中,输入 cpp_file_wrap.cxx,然后单击确定关闭对话框。
  5. 右键单击 cpp_file.i和编译。这应该创建四个文件:三个在 C# Generated 文件夹中,一个在 C++ 项目中。
  6. 在 C++ 项目中创建一个 Generated Files 过滤器,并向其中添加 cpp_file_wrap.cxx
  7. 将三个 Generated 文件添加到 C# 项目的 Generated 文件夹。
  8. 右键单击 C# 项目并将 C++ 项目添加为依赖项。
  9. 在 C# 项目的 Properties 的 Build 选项卡中,将 Output Path 从 bin\Debug 更改为至 ..\Debug或者 C++ 项目输出目录的相对路径是什么。 .exe 和 .dll 需要在同一目录中。
  10. 在 C# 项目的 Main 中,添加行:
    var cpp = new cpp_file();
    Console.WriteLine(cpp.times2(5));
  11. 构建解决方案。
  12. 运行 C# 项目。

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

关于c++ - 如何在 Visual Studio 2010 中构建这个简单的 C++/SWIG/C# 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813429/

相关文章:

c++ - Arduino 的 C++ 类文件中的字符串未编译

python - 如何让 boost.python 教程与 Visual Studio 2010 和 python 3.4 一起工作?

c# - 如何在 VS2010 中创建 STA(单线程单元)控件

c++ - 如何在输出中添加额外的零,同时仍使其与表格对齐?

c++ - 使用参数 C++ 调用 std::thread 函数时出现编译器错误

c++ - 如何将指针函数从 C++ 导出到 C#?

c# - Task.Run 和 Task.Factory.StartNew 有什么区别

c#-4.0 - 有什么方法可以在运行时创建动态类型,而无需将它们永久保留在应用程序域中?

c++ - void()、逗号运算符 (operator,) 和不可能的 (?) 重载

visual-studio - VS 2010的试用版可以延长多少次?