CGAL 6.0.1弃用GMP/MPFR后Linux链接报错求助
我将现有基于CGAL 4.9.1的代码迁移到CGAL 6.0.1(该版本支持不依赖GMP和MPFR),CMake配置时保留默认CGAL_DO_NOT_USE_BOOST_MP=OFF,同时设置CGAL_DISABLE_GMP=ON和CGAL_CMAKE_EXACT_NT_BACKEND=BOOST_BACKEND,编译时额外传参数-DCMAKE_OVERRIDDEN_DEFAULT_ENT_BACKEND=BOOST_BACKEND。这套配置在macOS上运行正常,但在Ubuntu和openSUSE等Linux环境下链接应用时,出现大量未定义引用错误,例如:
undefined reference to
CORE::real_div::eval(CORE::RealRep const&, CORE::RealRep const&, CORE::extLong const&)' undefined reference to__gmpz_init_set_si'
undefined reference to `_mpfr_get_emin'
问题原因
Linux环境下,CGAL的CORE组件(精确几何计算依赖的子模块)默认仍会绑定GMP/MPFR,即便全局配置了禁用,部分子模块未正确继承该设置;此外,CMake缓存的旧配置也可能导致链接阶段仍尝试关联GMP/MPFR库。
解决步骤
清理CMake缓存,避免旧配置干扰
删除项目根目录下的缓存文件和生成目录,确保配置完全重新生成:rm -f CMakeCache.txt rm -rf CMakeFiles强制CORE组件禁用GMP依赖
在CMake配置命令中添加CGAL_CORE_DISABLE_GMP=ON,明确告诉CORE模块不要使用GMP:cmake .. \ -DCGAL_DISABLE_GMP=ON \ -DCGAL_CMAKE_EXACT_NT_BACKEND=BOOST_BACKEND \ -DCGAL_CORE_DISABLE_GMP=ON \ -DCMAKE_OVERRIDDEN_DEFAULT_ENT_BACKEND=BOOST_BACKEND确保Boost多精度库已正确安装
Linux环境下必须安装Boost的数学和多精度组件,否则Boost后端无法正常工作:- Ubuntu/Debian系:
sudo apt-get install libboost-math-dev libboost-multiprecision-dev - openSUSE系:
sudo zypper install boost-math-devel boost-multiprecision-devel
若需排查Boost查找问题,可添加
-DBoost_DEBUG=ON参数运行CMake,查看详细的库查找日志。- Ubuntu/Debian系:
验证CGAL配置有效性
运行CMake后,检查输出日志中的关键配置项,确认以下参数为预期值:CGAL_DISABLE_GMP: ONCGAL_EXACT_NT_BACKEND: BOOST_BACKENDCGAL_CORE_DISABLE_GMP: ON
若参数不符,需重新清理缓存并核对配置命令。
代码中显式指定Boost后端内核
确保代码使用的几何内核基于Boost后端,避免默认绑定GMP:#include <CGAL/Exact_predicates_exact_constructions_kernel.h> typedef CGAL::Exact_predicates_exact_constructions_kernel_with_boost_kernel Kernel;
内容的提问来源于stack exchange,提问作者Fabian

