emscripten 和 CMake 库的放置位置

Posted

技术标签:

【中文标题】emscripten 和 CMake 库的放置位置【英文标题】:Where to place libraries for emscripten and CMake 【发布时间】:2014-03-29 10:26:55 【问题描述】:

当我想在“普通”程序中使用库时,我会使用 apt 安装它们

apt-get install libjsoncpp-dev
apt-get install libassimp-dev

然后是 CMakeLists.txt 中的 FIND_LIBRARY

FIND_LIBRARY(JSONCPP_LIBRARY NAMES jsoncpp)
TARGET_LINK_LIBRARIES(hello $JSONCPP_LIBRARY)

FIND_LIBRARY(ASSIMP_LIBRARY NAMES assimp)
TARGET_LINK_LIBRARIES(hello $ASSIMP_LIBRARY)

当使用 emscripten 编译时,我显然必须以另一种方式安装库。我创建了一个目录 $HOME/emscripten-prefix 并使用 --prefix=$HOME/emscripten-prefix 手动将它们编译为静态库,并尝试使用 CMAKE_INSTALL_PREFIX 像这样查看该目录(对于 CMAKE_PREFIX_PATH 也是如此):

cmake \
    -DCMAKE_TOOLCHAIN_FILE=$EMSCRIPTEN/cmake/Platform/Emscripten.cmake \
    -DCMAKE_BUILD_TYPE=Debug \
    -G "Unix Makefiles" \
    -DCMAKE_INSTALL_PREFIX=$HOME/emscripten-prefix

不幸的是,它没有用。 strace 透露 CMake 将预先设置 CMAKE_FIND_ROOT_PATH(在 $EMSCRIPTEN/cmake/Platform/Emscripten.cmake 中设置为“$EMSCRIPTEN_ROOT_PATH/cmake”)到所有路径。我尝试使用 -DCMAKE_FIND_ROOT_PATH 更改它,但 Emscripten.cmake 覆盖了它。

这样做的正确方法是什么?我想我可以通过制作一个复制 Emscripten.cmake 并修改 CMAKE_FIND_ROOT_PATH 的脚本来构建它,但这听起来像是错误的方式。

【问题讨论】:

【参考方案1】:

这个问题有一个简单的解决方案:

在调用 find_library() 之前:

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)

之后:

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

同样,在调用 find_package() 之前:

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)

之后:

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

【讨论】:

以上是关于emscripten 和 CMake 库的放置位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)

如何将 emscripten 与 cmake 一起用于项目依赖项?

如何让 JetBrains CLion 中的“cmake”工作来编译 Emscripten/WebAssembly?

使用 CMake 时如何在 Emscripten 中导出 C 函数

Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标

CMake可以生成配置文件吗?