我需要帮助来设置一个简单的 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 项目并尝试构建该项目时,我收到两个链接器错误。
- 错误 LNK1120:1 个 Unresolved external 问题
- 错误 LNK2001:无法解析的外部符号 _times2
第一条错误消息指向我的 dll 文件。第二个错误指向某个目标文件 (*.obj)。错误消息中提到“_times2”的符号在我的项目中找不到。
如何推进我的简单项目?是否有一些教程或文档可以逐步解释此过程?我找不到任何涉及 C++ 与 SWIG、C#、Visual Studio 2010 和 .Net v4.0 的内容。
最佳答案
在 VS2010 IDE 中完全构建的分步说明:
- 创建一个包含两个项目的解决方案:
- C# 控制台应用程序
- C++ Win32 控制台应用程序(名称=cpp、DLL、空项目)。如果您选择不同的名称,请不要在您的项目中使用类的名称并更新 .i 文件
%module
名称匹配。
- 在 C# 项目中创建一个名为 Generated 的文件夹。
- 将您的 .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"
- 选择
cpp_file.i
, Properties, General, Item Type 作为Custom Build Tool。 - 选择应用创建自定义构建工具属性组。
- 在自定义构建工具、常规、命令行中输入:
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。
- 将三个 Generated 文件添加到 C# 项目的 Generated 文件夹。
- 右键单击 C# 项目并将 C++ 项目添加为依赖项。
- 在 C# 项目的 Properties 的 Build 选项卡中,将 Output Path 从
bin\Debug
更改为至..\Debug
或者 C++ 项目输出目录的相对路径是什么。 .exe 和 .dll 需要在同一目录中。 - 在 C# 项目的
Main
中,添加行:
var cpp = new cpp_file();
Console.WriteLine(cpp.times2(5));
- 构建解决方案。
- 运行 C# 项目。
祝你好运!如果你让它工作,请告诉我。我可以扩展任何不清楚的地方。
关于c++ - 如何在 Visual Studio 2010 中构建这个简单的 C++/SWIG/C# 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813429/