Windows C++项目CMake配置OpenCascade第三方依赖报错问题
这是OpenCascade 7.6.0 VC14官方预编译安装包的已知打包缺陷:随包提供的CMake配置文件中,硬编码了官方编译安装包时使用的第三方库绝对路径(即报错中出现的C:/occt-3rdparty/...),没有做安装路径适配,配置文件里记录的第三方库版本、路径、库名都是编译机上的状态,和用户本地安装后的实际文件完全不匹配,才会出现一系列找不到库、版本不对、库名不匹配的错误。
1. 先恢复混乱的文件路径
把你之前手动移动到C:/occt-3rdparty下的所有第三方库文件夹全部移回OpenCascade原安装目录,不要手动修改文件夹名、库文件名,避免后续路径匹配逻辑混乱。
同时确认编译器版本匹配:opencascade-7.6.0-vc14-64.exe对应VS2015/VS2017的v141、v140工具集,如果使用VS2019/VS2022,需要手动在项目中选中v141工具集,否则会出现ABI兼容问题。
2. CMake配置时传入第三方库根路径
不要直接调用默认的find_package让配置文件读取硬编码路径,在CMake配置阶段提前传入3RDPARTY_DIR参数,指定本地第三方库的根目录:
- 如果用命令行+Ninja/VS生成器,配置命令参考如下,路径替换为本地实际安装路径:
cmake -S . -B build -G "Visual Studio 15 2017 Win64" ^ -DCMAKE_BUILD_TYPE=Release ^ -DOpenCASCADE_DIR="C:/OpenCASCADE-7.6.0-vc14-64/opencascade-7.6.0/cmake" ^ -D3RDPARTY_DIR="C:/OpenCASCADE-7.6.0-vc14-64"
- 如果用CMake GUI配置,在第一次点击
Configure前,手动添加3RDPARTY_DIR的PATH类型条目,值填OpenCascade安装目录下第三方库所在的父目录(也就是ffmpeg、freetype、tbb这些文件夹所在的目录)。
3. 按需链接模块,禁止全量链接所有库
直接链接${OpenCASCADE_LIBRARIES}会把所有模块(包括Draw测试模块、TKIVtk VTK交互模块、OpenGLES测试模块等非业务必要组件)全部加入链接列表,这些模块依赖angle、VTK、Qt、TclTk等大量普通开发用不到的第三方库,平白增加依赖负担。
常规几何建模、STEP/IGES/STL导入导出、基础3D显示场景,只需要链接对应模块组即可,CMakeLists.txt参考配置如下:
cmake_minimum_required(VERSION 3.15) project(MYAPP CXX) find_package(OpenCASCADE REQUIRED) add_executable(MYAPP main.cpp) # 配置头文件路径 target_include_directories(MYAPP PRIVATE ${OpenCASCADE_INCLUDE_DIR}) # 配置库搜索路径 target_link_directories(MYAPP PRIVATE ${OpenCASCADE_LIBRARY_DIR}) # 按需选择模块组,不需要的可以直接注释删除 target_link_libraries(MYAPP PRIVATE # 基础核心模块(必选) ${OpenCASCADE_FoundationClasses_LIBRARIES} # 几何/拓扑建模数据模块(做建模必选) ${OpenCASCADE_ModelingData_LIBRARIES} # 建模算法模块(做布尔运算、倒圆角等操作必选) ${OpenCASCADE_ModelingAlgorithms_LIBRARIES} # 可视化模块(需要渲染3D窗口才加) ${OpenCASCADE_Visualization_LIBRARIES} # 数据交换模块(需要STEP/IGES/STL等格式导入导出才加) ${OpenCASCADE_DataExchange_LIBRARIES} )
注意:TKIVtk、TKDraw、TKViewerTest这类测试、VTK交互模块非特殊需求不要链接,这类模块依赖的第三方库版本匹配成本极高,普通业务开发完全用不上。
4. 剩余依赖手动修正
如果传入3RDPARTY_DIR后还是提示找不到tbb、freetype这类基础依赖,不需要移动文件,直接在CMake中手动指定对应库的路径即可,示例如下:
# 替换为本地实际路径 set(3RDPARTY_TBB_DIR "C:/OpenCASCADE-7.6.0-vc14-64/tbb_2017.0.100") set(3RDPARTY_FREETYPE_DIR "C:/OpenCASCADE-7.6.0-vc14-64/freetype-2.5.5-vc14-64")
如果确实需要使用VTK相关功能,不要用安装包自带的VTK库,需要自行编译和OpenCascade版本匹配的VTK(官方预编译包带的VTK库名带版本后缀,和OpenCascade编译时链接的无后缀库名不匹配,无法直接链接)。
5. 运行时配置
编译生成可执行文件后,将${OpenCASCADE_BINARY_DIR}路径下的dll,以及用到的第三方库(freetype、tbb等)的dll复制到exe同级目录,或者将这些路径加入系统PATH环境变量,避免运行时提示找不到dll。
内容的提问来源于stack exchange,提问作者wsys

