Ошибка компиляции 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 бит немного грязно...

Другие вопросы по тегам