Я довольно новичок в 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 тоже не помогает ....
Есть идеи, как пройти это?
Заранее спасибо!