1

我已经在 win7 x64 pc 上下载并成功编译了metis 5.0.2并尝试编译metisex。我使用 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 上也有同样的错误)提前谢谢

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 *

/

4

1 回答 1

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"
    
  • 在我们构建解决方案之前,我们需要先解决一些问题。一些头文件不必要地重新定义rint了 MSVC 的功能(metisbin.hmetislib.hgk_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替换所有出现的__threadwith__declspec(thread)

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

  • 我们主要对这个metis项目感兴趣。其结果应存储在C:\metis-5.1.0\build\windows\libmetis\Release\metis.lib(静态库)中。

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

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

  • 我们再次需要修复一些事情:首先重命名metismex.cmetismex.cpp(C++ 编译器比 Visual Studio 中的 C 编译器好得多!)。接下来编辑此文件并将:替换#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 的情况下编写的,并且依赖于许多不适用于 Windows 的 POSIX 功能。此外,整个 32 位与 64 位有点混乱......

于 2014-09-29T19:28:43.537 回答