Невозможно построить большой проект с SWIG из C ++ в Java - PullRequest
0 голосов
/ 19 мая 2019

Я довольно новичок в VS, и с некоторыми проблемами мне удалось клонировать существующий большой проект c ++, используя плагин Mercurial в VS2015 (http://bio3d.colorado.edu/SerialEM/OpenSerialEM) с несколькими исходными и заголовочными файлами с намерением получить доступ к основному .cpp файл с использованием Java. Я написал фиктивную функцию в основном исходном файле с намерением обернуть его с помощью SWIG, но не успешно. Примеры SWIG скомпилированы нормально. Также проект скомпилирован без SWIG. Кроме того, если я пропущу %include "SerialEM.h" из файла интерфейса он компилируется нормально, но тогда я не могу открыть библиотеку в Eclipse, используя System.load("SerialEMProject"), выдавая ошибку java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library

SerialEM.i

/* File: SerialEM.i */
%module SerialEMProject
%{
#include "SerialEM.h"
extern int testFIJI(int n);
%}

extern int testFIJI(int n);
%include "SerialEM.h"

SerialEM.cpp

...
   mCamLowDoseParams[j][SEARCH_AREA].delayFactor = 0.05f;
  }

}

int testFIJI(int a)
{

    int para = a + 5;
    return para;
}

void CSerialEMApp::InitializeOneLDParam(LowDoseParams &ldParam)
{
  ldParam.magIndex = 0;
  ldParam.camLenIndex = 0;
... file continues

SerialEM.h

// SerialEM.h : main header file for the SERIALEM application
//

#if !defined(AFX_SERIALEM_H__F084D61C_0A12_4CD1_AC1F_1AC785054FCE__INCLUDED_)
#define AFX_SERIALEM_H__F084D61C_0A12_4CD1_AC1F_1AC785054FCE__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif


#define MAX_CAMERAS  6
#define MAX_DLG_CAMERAS  6
... file continues

Мое правило сборки для файла интерфейса: swig -c ++ -java -o $ (ProjDir) \ $ SerialEM_wrap.cxx SerialEM.i Вывод: $ (ProjDir) \ $ SerialEM_wrap.cxx

Я использую v140 Release x64 и пытаюсь построить динамическую библиотеку.

Я пытался следовать этим инструкциям из примера документа Swig для Java (http://www.swig.org/Doc4.0/Java.html#Java)

Я отключил предварительно скомпилированные заголовки из файлов SerialEM.cpp и SerialEM_wrap.cxx. В настройках проекта они включены с заголовочным файлом stdafx.h

Когда я строю SerialEMProject, я получаю ошибку

CPP #error "include 'stdafx.h' before including this file for PCH". Use the -cpperraswarn option to continue swig processing

в этой строке:

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

Также ошибка:

Syntax error - possibly a missing semicolon.

на линии

void DLL_IM_EX SEMReportCOMError(_com_error E, CString inString, CString *outStr = NULL, bool skipErr = false);

DLL_IM_EX определен в stdafx.h.

добавление #include "stdafx.h" до этой строки не помогает. Ни положить это в файл интерфейса. использование опции -cpperraswarn тоже не помогает ....

Есть идеи, как пройти это?

Заранее спасибо!

...