Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I build this simple C++/SWIG/C# project in Visual Studio 2010?

I need help setting up a simple C++/C# SWIG project. I am having a hard time putting together a C++ project that uses the SWIG bindings. I'm using Visual Studio 2010 and the most recent version of SWIG.

My code is simply:

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;
}

And my SWIG interface file is:

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);

I can compile this project fine. I then run the SWIG command to generate the wrapper:

swig -csharp "C:/pathToFile/cpp_file.i"

I don't know what to do at this point. I can't find any tutorials or documentation that explains what to do in Visual Studio 2010.

When I add the *cpp_file_wrap.c* file that SWIG generates to my Visual Studio 2010 project and attempt to build the project, I get two linker errors.

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

The first error message points to my dll file. The second error points to some object file (*.obj). The symbol that the error message mentions "_times2" is no where to be found in my project.

How can I move forward with my simple project? Is there some tutorial or some documentation that explains this process step-by-step? I can't find anything that involves C++ with SWIG, C#, Visual Studio 2010, and .Net v4.0.

like image 299
user1214135 Avatar asked Mar 21 '12 21:03

user1214135


People also ask

What is SWIG C++?

SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. SWIG is used with different types of target languages including common scripting languages such as Javascript, Perl, PHP, Python, Tcl and Ruby.

How do I use SWIG in Python?

Installation. Apart from that you may need “Microsoft Visual Studio 14.0” or higher to run swig program in windows. To illustrate the use of swig, suppose we have some c function and we want to add it to other languages like Tcl, Perl, Python (I am interacting with python), Java and C#.

What is SWIG library?

The Simplified Wrapper and Interface Generator (SWIG) is an open-source software tool used to connect computer programs or libraries written in C or C++ with scripting languages such as Lua, Perl, PHP, Python, R, Ruby, Tcl, and other languages like C#, Java, JavaScript, Go, D, OCaml, Octave, Scilab and Scheme.


1 Answers

Step-by-Step instructions to completely build in the VS2010 IDE:

  1. Create a solution with two projects:
    • C# Console Application
    • C++ Win32 Console Application (Name=cpp, DLL, empty project). If you choose a different name, don't use the name of a class in your project and update the .i file %module name to match.
  2. Create a folder in the C# project called Generated.
  3. Add your .cpp, .h, and .i file to the DLL with the modifications below.
    • Note the whole class has to be exported. Replace <project> with the name of the project. There will be a preprocessor definition <project>_EXPORTS already defined for your DLL project (see Project, Properties, C++, Preprocessor).
    • The module name cannot match a class name in the module.
    • %include <windows.i> helps SWIG understand certain "Window-isms" like __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. Select cpp_file.i, Properties, General, Item Type as Custom Build Tool.
  2. Select Apply to create the Custom Build Tool property group.
  3. In Custom Build Tool, General, Command Line enter:
    swig -csharp -c++ -outdir GeneratedFolderPath cpp_file.i
  4. In Outputs, enter cpp_file_wrap.cxx, and click OK to close the dialog.
  5. Right-click cpp_file.i and Compile. This should create four files: three in the C# Generated folder and one in the C++ project.
  6. Create a Generated Files filter in the C++ project and add cpp_file_wrap.cxx to it.
  7. Add the three Generated files to the C# project's Generated folder.
  8. Right-click the C# project and add the C++ project as a dependency.
  9. In the C# project's Properties, Build tab, change the Output Path from bin\Debug to ..\Debug or whatever the relative path to the C++ Project output directory is. The .exe and .dll need to be in the same directory.
  10. In the C# project's Main, add the lines:
    var cpp = new cpp_file();
    Console.WriteLine(cpp.times2(5));
  11. Build the solution.
  12. Run the C# project.

Good luck! Let me know if you get it to work. I can expand on anything unclear.

like image 200
Mark Tolonen Avatar answered Sep 26 '22 15:09

Mark Tolonen