使用emcmake编译WASM时find_package无法找到已安装CGAL包
问题根因
emcmake会自动为CMake加载Emscripten交叉编译工具链,交叉编译模式下CMake默认不会检索宿主系统(当前为macOS)下的原生架构库。你本地通过原生cmake找到的/usr/local/lib路径下的CGAL、GMP、MPFR、Boost均为AppleClang编译的Mach-O格式二进制,和WASM字节码格式不兼容,即便强行检索到也无法完成链接,因此find_package(CGAL)会判定依赖缺失,触发跳过编译的逻辑。
解决方案
分两种场景处理:
- 场景1:当前测试代码不需要实际调用CGAL能力
直接删除CMakeLists.txt中所有和CGAL、Boost查找、链接相关的代码段即可,emcmake可直接完成配置编译。 - 场景2:后续代码需要实际依赖CGAL能力
必须完整编译整套WASM版本的CGAL依赖链,不能复用系统原生库,步骤如下:- 先编译CGAL的必选底层依赖的WASM版本:GMP、MPFR、Boost。所有依赖编译时统一使用
emcmake做配置、emmake执行编译安装,建议统一安装到独立的WASM依赖目录(比如$HOME/wasm-deps),不要和原生库混放。 - 编译WASM版本CGAL。配置CGAL编译参数时显式指定依赖查找路径,避免搜索到系统原生库:
emcmake cmake <CGAL源码路径> -DCMAKE_INSTALL_PREFIX=$HOME/wasm-deps -DCMAKE_FIND_ROOT_PATH=$HOME/wasm-deps emmake make install -j$(nproc) - 回到你自己的项目目录,先清空原生cmake生成的缓存(必须删除
CMakeCache.txt和CMakeFiles目录,否则会残留原生库路径导致配置失败),再执行emcmake配置:rm -rf CMakeCache.txt CMakeFiles emcmake cmake . -DCMAKE_PREFIX_PATH=$HOME/wasm-deps - 链接阶段记得追加Emscripten编译选项
-s DISABLE_EXCEPTION_CATCHING=0,CGAL内部大量使用C++异常,默认Emscripten关闭异常捕获会导致运行时崩溃。
- 先编译CGAL的必选底层依赖的WASM版本:GMP、MPFR、Boost。所有依赖编译时统一使用
排错提示
当前你在find_package(CGAL)中加了QUIET参数,会隐藏所有依赖查找失败的具体报错,排错阶段先去掉这个参数,就能看到具体是哪个依赖没找到,不用盲目猜问题。
内容的提问来源于stack exchange,提问作者StrandedKitty
相关产品推荐
相关产品推荐

