VS2017编译OpenCascade报错及轻量使用、库链接咨询
1. MSB8036错误原因
这个错误的核心原因是你编译OpenCascade时,项目默认绑定了Windows SDK 8.1,但你的VS2017环境中没有安装该版本SDK,或者后续打开的示例项目SDK版本与OCCT编译时的版本不匹配。
OpenCascade官方编译脚本默认会指定较旧的Windows SDK版本(比如8.1),而VS2017通常默认安装的是Windows 10 SDK(如10.0.17763.0及以上)。当VS检查项目配置的SDK版本不存在时,就会抛出这个错误。
解决办法有两种:
- 直接安装Windows SDK 8.1:打开VS2017安装器,在「单个组件」里找到「Windows 8.1 SDK」勾选安装;
- 修改项目SDK版本:右键项目→属性→配置属性→常规,将「Windows SDK版本」修改为你已安装的Win10 SDK版本,若你是自己编译的OCCT,重新编译时也要指定对应SDK版本。
2. 轻量使用是否需要完整编译?
完全不需要!如果你只是做简单的多段线偏移、多边形缩小这类基础操作,只用到OCCT的几何建模、拓扑操作、偏移模块,完全可以不用编译整个库:
- 优先找适配VS2017的预编译二进制包:虽然官方安装包可能标注不适配,但社区里有很多整理好的对应vc141(VS2017工具集版本)的预编译OCCT包,下载解压就能用;
- 若一定要自己编译,只编译必要模块:比如
TKernel(核心基础)、TKGeomBase(几何基础)、TKBRep(拓扑表示)、TKOffset(偏移操作)这几个核心模块,跳过可视化、数据交换等非必要模块,能大幅缩短编译时间。
3. VS新项目链接OpenCascade库的步骤
这里给你一套完整的轻量配置流程:
步骤1:新建项目
打开VS2017,新建C++空项目,将项目平台设置为x64(和你的Win10 64位环境匹配,OCCT预编译包一般也是x64版本)。步骤2:配置包含目录
右键项目→属性→配置属性→C/C++→常规,在「附加包含目录」中添加OCCT的include文件夹路径,比如:D:\OpenCascade-7.5.0\include步骤3:配置库目录
切换到「链接器→常规」,在「附加库目录」中添加OCCT的lib文件夹路径(对应vc141的x64版本),比如:D:\OpenCascade-7.5.0\lib\win64\vc141步骤4:配置链接器输入
切换到「链接器→输入」,在「附加依赖项」中添加你需要的库文件,针对多段线偏移和多边形缩小,只需要添加这些:TKernel.lib TKMath.lib TKGeomBase.lib TKBRep.lib TKOffset.lib(如果需要可视化,可以再加
TKOpenGl.lib、TKG3d.lib等,但轻量使用不需要)步骤5:配置运行时环境
为了让程序运行时能找到OCCT的dll文件,有两种方式:- 把OCCT的
bin\win64\vc141路径添加到系统环境变量PATH里(需要重启VS生效); - 右键项目→属性→配置属性→调试,在「环境」中添加:
PATH=$(PATH);D:\OpenCascade-7.5.0\bin\win64\vc141
- 把OCCT的
步骤6:测试代码
新建cpp文件,写一段简单的偏移测试代码:#include <TopoDS_Wire.hxx> #include <BRepBuilderAPI_MakePolygon.hxx> #include <BRepOffsetAPI_MakeOffset.hxx> #include <iostream> int main() { // 创建一个矩形多段线 BRepBuilderAPI_MakePolygon poly; poly.Add(gp_Pnt(0, 0, 0)); poly.Add(gp_Pnt(10, 0, 0)); poly.Add(gp_Pnt(10, 10, 0)); poly.Add(gp_Pnt(0, 10, 0)); poly.Close(); TopoDS_Wire wire = poly.Wire(); // 向内偏移2个单位 BRepOffsetAPI_MakeOffset offset(wire); offset.Perform(-2.0); if (offset.IsDone()) { TopoDS_Shape offsetShape = offset.Shape(); std::cout << "偏移成功!" << std::endl; } else { std::cout << "偏移失败!" << std::endl; } return 0; }编译运行,如果输出「偏移成功!」就说明配置没问题了。
内容的提问来源于stack exchange,提问作者sazr

