Ошибка компиляции metismex в matlab r2013
Я скачал и успешно скомпилировал metis 5.0.2 в win7 x64 pc и пытался скомпилировать metismex. Я скомпилировал метис с помощью Visual Studio 11 (2012) и использовал тот же компилятор из Matlab. После долгих экспериментов с кучей ошибок (в основном из-за проблем с путями из библиотек) я достиг точки, когда я не знаю, как поступить, так как мои знания по c и C++ довольно просты. Итак, вот ошибка:
../GKlib/mat_libs/.\stddef.h(16) : error C2054: expected '(' to follow '_SIZE_TYPE__'
../GKlib/mat_libs/.\stddef.h(19) : error C2085: '_WCHAR_TYPE__' : not in formal parameter list
Я узнал о встроенных функциях и т. Д., Но так как ошибка находится в библиотеке, и я точно не знаю, что мне делать, вот и я. Итак, код ошибки выдается здесь:
typedef __SIZE_TYPE__ size_t;
#ifndef __cplusplus
typedef __WCHAR_TYPE__ wchar_t;
#endif
какие-нибудь предложения относительно того, что я должен сделать, не испортить это? (в случае, если я закомментирую тип wchar, у меня также будет такая же ошибка на prtdiff_type) Заранее спасибо
PS: в случае, если это необходимо, вот весь sttdef.h
/* Copyright 2012 The MathWorks, Inc. */
#ifndef _STDDEF_H
#define _STDDEF_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
# define NULL (0)
#else
# define NULL ((void *)0)
#endif
typedef __SIZE_TYPE__ size_t;
#ifndef __cplusplus
typedef __WCHAR_TYPE__ wchar_t;
#endif
typedef __PTRDIFF_TYPE__ ptrdiff_t;
#if (! defined(__cplusplus)) || (! defined(PST_GNU))
# define offsetof(type, field) ((size_t) &((type *)0)->field)
#else
# define offsetof(type, field) \
(__offsetof__(reinterpret_cast<size_t> \
(&reinterpret_cast<const volatile char &> \
(static_cast<type *>(0)->field))))
#endif
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* _STDDEF_H *
/
1 ответ
Вот краткий обзор того, что я сделал. Я бегу R2014a с VS2013 на Win8.1 x64.
1) Сначала мы собираем метис:
Скачать и извлечь
metis-5.1.0
скажем, в каком-то местеC:\metis-5.1.0
редактировать
C:\metis-5.1.0\include\metis.h
и установить#define IDXTYPEWIDTH 64
(для архитектуры x64)Далее мы генерируем проекты Visual Studio, используя CMake:
> cd C:\metis-5.1.0 > vsgen -G "Visual Studio 12 2013 Win64"
Прежде чем мы создадим решение, нам нужно сначала исправить некоторые вещи. Некоторые заголовочные файлы излишне переопределяются
rint
функция для MSVC (metisbin.h
,metislib.h
, а такжеgk_arch.h
). Удалить такие строки:#ifdef __MSC__ /* MSC does not have rint() function */ #define rint(x) ((int)((x)+0.5)) /* MSC does not have INFINITY defined */ #ifndef INFINITY #define INFINITY FLT_MAX #endif #endif
Также в
GKlib\gk_externs.h
заменить все вхождения__thread
с__declspec(thread)
Далее откройте файл решения
C:\metis-5.1.0\build\windows\METIS.sln
в Visual Stduio, и построитьALL_BUILD
цель (убедитесь, что выбран режим "x64" в режиме "Release").Мы в основном заинтересованы в
metis
проект. Его результат должен храниться вC:\metis-5.1.0\build\windows\libmetis\Release\metis.lib
(статическая библиотека).
2) Далее строим MEX-функцию:
Скачать
metismex
и распаковать его в папку внутри предыдущего места (C:\metis-5.1.0\metismex-master
)Опять же нам нужно исправить несколько вещей: сначала переименовать
metismex.c
вmetismex.cpp
(компилятор C++ намного лучше, чем компилятор C в Visual Studio!). Затем отредактируйте этот файл и замените:#include <strings.h>
с#include <string.h>
и сразу после него добавьте следующий код:#if defined(_WIN32) || defined(_WIN64) #define snprintf _snprintf #define vsnprintf _vsnprintf #define strcasecmp _stricmp #define strncasecmp _strnicmp #endif
Наконец, запустите MATLAB и выполните следующую команду для компиляции MEX-файла:
>> cd('C:\metis-5.1.0\metismex-master') >> mex -O -largeArrayDims -DWIN32 -DMSC -DUSE_GKREGEX -I../GKlib -I../include -I../libmetis metismex.cpp ../build/windows/libmetis/Release/metis.lib
Теперь у вас должен быть финал
metismex.mexw64
Я должен сказать, что ничего не знаю о библиотеке, поэтому я не могу гарантировать, что она дает правильные результаты после всех вышеуказанных изменений. Я просто показываю, как заставить его скомпилировать. Код был написан для Linux/OSX и основан на многих функциях POSIX, не предназначенных для Windows. Также все 32 против 64 бит немного грязно...