我已经在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 *
/
答案 0 :(得分:2)
以下是我所做的一些演练。我在Win8.1 x64上使用VS2013运行R2014a。
将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 rint
,metisbin.h
和metislib.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
(静态库)中。
下载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位也有点凌乱......