在matlab r2013中编译metismex时出错

时间:2014-09-29 14:03:49

标签: c matlab visual-c++ mex metis

我已经在win7 x64 pc中下载并成功编译了metis 5.0.2 并尝试编译metismex。 我用Visual Studio 11(2012)编译了metis,并在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上也有相同的错误) 提前致谢

P.S:如果需要,这就是整个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 个答案:

答案 0 :(得分:2)

以下是我所做的一些演练。我在Win8.1 x64上使用VS2013运行R2014a。

1)首先我们编译metis:

  • metis-5.1.0下载并解压缩到某个位置,例如C:\metis-5.1.0

  • 修改C:\metis-5.1.0\include\metis.h并设置#define IDXTYPEWIDTH 64(适用于x64架构)

  • 接下来,我们使用CMake生成Visual Studio项目:

    > cd C:\metis-5.1.0
    > vsgen -G "Visual Studio 12 2013 Win64"
    
  • 在我们构建解决方案之前,我们需要先解决一些问题。某些标头文件不必要地重新定义了MSVC rintmetisbin.hmetislib.h的{​​{1}}功能。删除这些行:

    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

  • 接下来在Visual Stduio中打开解决方案文件__declspec(thread),并构建C:\metis-5.1.0\build\windows\METIS.sln目标(确保选择“释放”模式中的“x64”)。

  • 我们主要对ALL_BUILD项目感兴趣。其结果应存储在metis(静态库)中。

2)接下来我们构建MEX函数:

  • 下载metismex并将其解压缩到上一个位置(C:\metis-5.1.0\build\windows\libmetis\Release\metis.lib)内的文件夹

  • 我们需要解决一些问题:首先将C:\metis-5.1.0\metismex-master重命名为metismex.c(C ++编译器比Visual Studio中的C编译器好得多!)。接下来编辑此文件并将metismex.cpp替换为#include <strings.h>,并在其后立即添加以下代码:

    #include <string.h>
  • 最后启动MATLAB,并运行以下命令编译MEX文件:

    #if defined(_WIN32) || defined(_WIN64)
      #define snprintf _snprintf
      #define vsnprintf _vsnprintf
      #define strcasecmp _stricmp
      #define strncasecmp _strnicmp
    #endif
    
  • 您现在应该拥有最终的>> 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

我应该说我对该库一无所知,所以在上述所有修改之后我无法保证它能给出正确的结果。我只是展示了如何编译它。代码是用Linux / OSX编写的,并且依赖于许多不适用于Windows的POSIX功能。整个32对64位也有点凌乱......