Как я могу построить этот простой проект C ++ / SWIG / C # в Visual Studio 2010? - PullRequest
10 голосов
/ 22 марта 2012

Мне нужна помощь в настройке простого проекта SWIG на C ++ / C #.Я с трудом собираю проект C ++, который использует привязки SWIG.Я использую 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.

Когда я добавляю файл * cpp_file_wrap.c *, который SWIG генерирует в мой проект Visual Studio 2010, и пытаюсь построить проект, Я получаю две ошибки компоновщика.

  1. ошибка LNK1120: 1 неразрешенная внешняя ошибка
  2. ошибка LNK2001: неразрешенный внешний символ _times2

Первое сообщение об ошибке указываетмой файл длл.Вторая ошибка указывает на некоторый объектный файл (* .obj).Символ, который упоминается в сообщении об ошибке «_times2», не найден в моем проекте.

Как я могу двигаться дальше с моим простым проектом?Есть какое-то учебное пособие или документация, которая объясняет этот процесс шаг за шагом?Я не могу найти ничего, что включает в себя C ++ с SWIG, C #, Visual Studio 2010 и .Net v4.0.

Ответы [ 2 ]

19 голосов
/ 22 марта 2012

Пошаговые инструкции по полной сборке в IDE VS2010:

  1. Создайте решение с двумя проектами:
    • Консольное приложение C #
    • C ++ Консольное приложение Win32 (Имя = cpp, DLL, пустой проект). Если вы выбираете другое имя, не используйте имя класса в своем проекте и обновите .i file %module name, чтобы соответствовать.
  2. Создайте папку в проекте C # с именем Сгенерировано .
  3. Добавьте ваш файл .cpp, .h и .i в DLL с указанными ниже изменениями.
    • Обратите внимание, что весь класс должен быть экспортирован. Замените <project> названием проекта. Для вашего проекта DLL уже определено определение препроцессора <project>_EXPORTS (см. Проект, Свойства, C ++, Препроцессор).
    • Имя модуля не может совпадать с именем класса в модуле.
    • %include <windows.i> помогает SWIG понимать определенные «оконные измы», такие как __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. Выберите Применить , чтобы создать группу свойств Custom Build Tool.
  3. В Custom Build Tool, General, в командной строке введите:
    swig -csharp -c ++ -outdir GeneratedFolderPath cpp_file.i
  4. В Outputs введите cpp_file_wrap.cxx и нажмите OK, чтобы закрыть диалоговое окно.
  5. Щелкните правой кнопкой мыши cpp_file.i и скомпилируйте. Это должно создать четыре файла: три в папке C # Generated и один в проекте C ++.
  6. Создайте фильтр Generated Files в проекте C ++ и добавьте к нему cpp_file_wrap.cxx .
  7. Добавьте три сгенерированных файла в папку Generated проекта C #.
  8. Щелкните правой кнопкой мыши проект C # и добавьте проект C ++ в качестве зависимости.
  9. На вкладке «Свойства» проекта C # измените путь вывода с bin\Debug на ..\Debug или любой другой относительный путь к выходному каталогу проекта C ++. .Exe и .dll должны находиться в одном каталоге.
  10. В Main проекта C # добавьте строки:
    var cpp = new cpp_file();
    Console.WriteLine(cpp.times2(5));
  11. Постройте решение.
  12. Запустите проект C #.

Удачи! Дайте мне знать, если вы заставите его работать. Я могу рассказать о чем угодно.

0 голосов
/ 22 марта 2012

Я использовал SWIG только небольшое количество, но похоже, что вы пытаетесь экспортировать функцию с именем times() в ваш файл .i, который не существует.У вас есть метод cpp_file::times(), но он не экспортируется.Вам нужно либо определить функцию times(), либо экспортировать весь класс cpp_file через SWIG.

Я бы потратил некоторое время на чтение официальной документации SWIG , в частности SWIGи C ++ раздел.Существует также этот вопрос по SO , в котором есть некоторая информация, касающаяся SWIG и VS2010.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...