VLFeat Matlab中c_eoverlap函数编译失败求助
编译Matlab MEX文件
c_eoverlap.cxx失败的排查与解决 问题背景
我按照VGG Affine项目的说明,在Matlab 2018a中尝试编译c_eoverlap.cxx,执行命令:
mex repeatability/c_eoverlap.cxx
使用的编译工具是Xcode Clang++,但编译未成功。我刚接触C++,暂时无法定位问题,需要大家的帮助。
(注:请补充以下信息以便更精准排查:
- 执行
gcc --version的输出结果 - 完整的编译错误日志内容)
通用排查与解决步骤
针对Matlab 2018a + Xcode Clang++编译MEX文件失败的场景,你可以按以下步骤尝试解决:
1. 验证Xcode版本兼容性
Matlab 2018a对Xcode的版本有明确限制,仅支持Xcode 9.0到9.4版本,如果你的Xcode版本过高(比如10+),会出现编译兼容问题。
- 查看当前Xcode版本:打开Xcode,点击菜单栏
Xcode > About Xcode查看版本 - 若版本不兼容,可以降级到Xcode 9.x系列,或者在Matlab中指定旧版本的Xcode命令行工具:
然后选择对应版本的Clang++工具链。mex -setup C++
2. 确认依赖文件路径
c_eoverlap.cxx可能依赖VGG项目中的其他头文件(比如项目自带的算法头文件),如果这些头文件不在Matlab的默认搜索路径中,编译会报错“头文件未找到”。
- 用
-I参数指定头文件所在的目录,比如假设VGG项目的头文件都在./affine/include下:mex -I./affine/include repeatability/c_eoverlap.cxx
3. 指定C++标准版本
Matlab 2018a的MEX编译默认可能使用较老的C标准,而c_eoverlap.cxx可能用到了C11及以上的特性,需要手动指定:
mex CXXFLAGS='$CXXFLAGS -std=c++11' repeatability/c_eoverlap.cxx
如果项目用到了更高版本的特性,可以尝试-std=c++14。
4. 针对错误日志的针对性解决
如果补充了错误日志,可以根据不同错误类型快速定位:
- 头文件未找到:用
-I参数添加对应的头文件目录 - 未定义的符号:说明缺少对应的库文件,需要用
-L指定库目录,-l指定库名,比如:mex -L./affine/lib -lmyaffine -I./affine/include repeatability/c_eoverlap.cxx - 语法错误:大概率是C++版本不兼容,优先调整编译参数指定对应标准版本
内容的提问来源于stack exchange,提问作者LYu
相关产品推荐
相关产品推荐

