首页 文章

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

提问于
浏览
9

我需要帮助设置一个简单的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 回答

  • 0

    完整构建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

    #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"
    
    • 选择 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#项目 .

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

  • 18

    我'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相关的信息 .

相关问题