You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emscripten编译Boost库后,如何让CMake识别到这些库?

问题分析:CMake识别ZLIB但无法识别Emscripten编译的Boost

环境与配置信息

CMakeLists.txt 内容

cmake_minimum_required(VERSION 3.22)
project(Minexample)

find_package(ZLIB)
if(ZLIB_FOUND)
  add_definitions(-DHAVE_LIBZ)
  include_directories(${ZLIB_INCLUDE_DIR})
endif()

# 指定CMake仅在指定目录搜索Boost
set(Boost_NO_SYSTEM_PATHS ON)
set(BOOST_ROOT "/home/hiisi/workspace/boost-1_75_0")
set(Boost_INCLUDE_DIR "/home/hiisi/workspace/boost-1_75_0")
#set(BOOST_LIBRARYDIR "/home/hiisi/workspace/boost-1_75_0/lib")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_DEBUG ON)
#set(Boost_COMPILER -emscripten-3.1.24)
#set(Boost_toolset emscripten-3.1.24)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_DETAILED_FAILURE_MSG ON)
Set(Boost_LIB_PREFIX "lib")
find_package(Boost COMPONENTS program_options iostreams system)
#find_package(Boost)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS} ${Boost_INCLUDE_DIR})
endif()

执行CMake的命令

emcmake cmake . -DZLIB_INCLUDE_DIR=/home/hiisi/workspace/zlib -DZLIB_LIBRARY=/home/hiisi/workspace/zlib/libz.a

CMake输出日志

configure: cmake . -DZLIB_INCLUDE_DIR=/home/hiisi/workspace/zlib -DZLIB_LIBRARY=/home/hiisi/workspace/zlib/libz.a -DCMAKE_TOOLCHAIN_FILE=/home/hiisi/workspace/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/home/hiisi/workspace/emsdk/node/14.18.2_64bit/bin/node;--experimental-wasm-threads
-- Found ZLIB: /home/hiisi/workspace/zlib/libz.a (found version "1.2.13") 
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1688 ] _boost_TEST_VERSIONS = "1.78.0;1.78;1.77.0;1.77;1.76.0;1.76;1.75.0;1.75;1.74.0;1.74;1.73.0;1.73;1.72.0;1.72;1.71.0;1.71;1.70.0;1.70;1.69.0;1.69;1.68.0;1.68;1.67.0;1.67;1.66.0;1.66;1.65.1;1.65.0;1.65;1.64.0;1.64;1.63.0;1.63;1.62.0;1.62;1.61.0;1.61;1.60.0;1.60;1.59.0;1.59;1.58.0;1.58;1.57.0;1.57;1.56.0;1.56;1.55.0;1.55;1.54.0;1.54;1.53.0;1.53;1.52.0;1.52;1.51.0;1.51;1.50.0;1.50;1.49.0;1.49;1.48.0;1.48;1.47.0;1.47;1.46.1;1.46.0;1.46;1.45.0;1.45;1.44.0;1.44;1.43.0;1.43;1.42.0;1.42;1.41.0;1.41;1.40.0;1.40;1.39.0;1.39;1.38.0;1.38;1.37.0;1.37;1.36.1;1.36.0;1.36;1.35.1;1.35.0;1.35;1.34.1;1.34.0;1.34;1.33.1;1.33.0;1.33"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1689 ] Boost_USE_MULTITHREADED = "ON"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1690 ] Boost_USE_STATIC_LIBS = "ON"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1691 ] Boost_USE_STATIC_RUNTIME = "ON"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1692 ] Boost_ADDITIONAL_VERSIONS = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1693 ] Boost_NO_SYSTEM_PATHS = "ON"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1725 ] BOOST_ROOT = "/home/hiisi/workspace/boost-1_75_0"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1726 ] ENV{BOOST_ROOT} = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1727 ] BOOST_INCLUDEDIR = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1728 ] ENV{BOOST_INCLUDEDIR} = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1729 ] BOOST_LIBRARYDIR = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1730 ] ENV{BOOST_LIBRARYDIR} = <unset>
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1818 ] location of version.hpp: /home/hiisi/workspace/boost-1_75_0/boost/version.hpp
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1858 ] Boost_VERSION = "1.75.0"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1859 ] Boost_VERSION_STRING = "1.75.0"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1860 ] Boost_VERSION_MACRO = "107500"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1861 ] Boost_VERSION_MAJOR = "1"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1862 ] Boost_VERSION_MINOR = "75"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1863 ] Boost_VERSION_PATCH = "0"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1864 ] Boost_VERSION_COUNT = "3"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1888 ] Boost_LIB_PREFIX = "lib"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1889 ] Boost_NAMESPACE = "boost"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:953 ] _boost_COMPILER = "-clang16" (guessed)
-- [ /usr/share/cmake/Modules/FindBoost.cmake:1925 ] _boost_MULTITHREADED = "-mt"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2003 ] _boost_ARCHITECTURE_TAG = "" (detected)
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2007 ] _boost_RELEASE_ABI_TAG = "-s"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2008 ] _boost_DEBUG_ABI_TAG = "-sd"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2068 ] _boost_LIBRARY_SEARCH_DIRS_RELEASE = "/home/hiisi/workspace/boost-1_75_0/lib;/home/hiisi/workspace/boost-1_75_0/stage/lib;/home/hiisi/workspace/boost-1_75_0/lib;/home/hiisi/workspace/boost-1_75_0/../lib;/home/hiisi/workspace/boost-1_75_0/stage/lib;NO_CMAKE_SYSTEM_PATH;NO_SYSTEM_ENVIRONMENT_PATH"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2069 ] _boost_LIBRARY_SEARCH_DIRS_DEBUG = "/home/hiisi/workspace/boost-1_75_0/lib;/home/hiisi/workspace/boost-1_75_0/stage/lib;/home/hiisi/workspace/boost-1_75_0/lib;/home/hiisi/workspace/boost-1_75_0/../lib;/home/hiisi/workspace/boost-1_75_0/stage/lib;NO_CMAKE_SYSTEM_PATH;NO_SYSTEM_ENVIRONMENT_PATH"
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2254 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: libboost_program_options-clang16-mt-s-1_75;libboost_program_options-clang16-mt-s;libboost_program_options-clang16-mt-s;libboost_program_options-mt-s-1_75;libboost_program_options-mt-s;libboost_program_options-mt-s;libboost_program_options-mt;libboost_program_options
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2309 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: libboost_program_options-clang16-mt-sd-1_75;libboost_program_options-clang16-mt-sd;libboost_program_options-clang16-mt-sd;libboost_program_options-mt-sd-1_75;libboost_program_options-mt-sd;libboost_program_options-mt-sd;libboost_program_options-mt;libboost_program_options
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2254 ] Searching for IOSTREAMS_LIBRARY_RELEASE: libboost_iostreams-clang16-mt-s-1_75;libboost_iostreams-clang16-mt-s;libboost_iostreams-clang16-mt-s;libboost_iostreams-mt-s-1_75;libboost_iostreams-mt-s;libboost_iostreams-mt-s;libboost_iostreams-mt;libboost_iostreams
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2309 ] Searching for IOSTREAMS_LIBRARY_DEBUG: libboost_iostreams-clang16-mt-sd-1_75;libboost_iostreams-clang16-mt-sd;libboost_iostreams-clang16-mt-sd;libboost_iostreams-mt-sd-1_75;libboost_iostreams-mt-sd;libboost_iostreams-mt-sd;libboost_iostreams-mt;libboost_iostreams
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2254 ] Searching for SYSTEM_LIBRARY_RELEASE: libboost_system-clang16-mt-s-1_75;libboost_system-clang16-mt-s;libboost_system-clang16-mt-s;libboost_system-mt-s-1_75;libboost_system-mt-s;libboost_system-mt-s;libboost_system-mt;libboost_system
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2309 ] Searching for SYSTEM_LIBRARY_DEBUG: libboost_system-clang16-mt-sd-1_75;libboost_system-clang16-mt-sd;libboost_system-clang16-mt-sd;libboost_system-mt-sd-1_75;libboost_system-mt-sd;libboost_system-mt-sd;libboost_system-mt;libboost_system
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2254 ] Searching for REGEX_LIBRARY_RELEASE: libboost_regex-clang16-mt-s-1_75;libboost_regex-clang16-mt-s;libboost_regex-clang16-mt-s;libboost_regex-mt-s-1_75;libboost_regex-mt-s;libboost_regex-mt-s;libboost_regex-mt;libboost_regex
-- [ /usr/share/cmake/Modules/FindBoost.cmake:2309 ] Searching for REGEX_LIBRARY_DEBUG: libboost_regex-clang16-mt-sd-1_75;libboost_regex-clang16-mt-sd;libboost_regex-clang16-mt-sd;libboost_regex-mt-sd-1_75;libboost_regex-mt-sd;libboost_regex-mt-sd;libboost_regex-mt;libboost_regex
-- Could NOT find Boost (missing: program_options iostreams system) (found version "1.75.0")
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hiisi/workspace/minexmpl

Boost库目录内容

cmake  libboost_filesystem.a  libboost_filesystem.bc  libboost_iostreams.a  libboost_iostreams.bc  libboost_program_options.a  libboost_program_options.bc

Boost编译命令

emconfigure ./b2 toolset=emscripten link=static runtime-link=static threading=multi --prefix=/home/hiisi/workspace/boost-1_75_0 --with-program_options --with-iostreams --with-filesystem
./b2 install --prefix=/home/hiisi/workspace/boost-1_75_0

问题原因与解决方案

核心原因

ZLIB能被识别是因为你直接通过-DZLIB_LIBRARY指定了库文件路径,跳过了自动命名匹配逻辑;而Boost找不到的关键原因是:
FindBoost会根据环境自动拼接编译器标签(-clang16)、多线程标签(-mt)、**静态运行时标签(-s)**和版本后缀,比如搜索libboost_program_options-clang16-mt-s-1_75,但你实际生成的库文件名是libboost_program_options.a,完全没有这些标签,导致匹配失败。

另外,你在CMake中搜索了system组件,但当前Boost库目录里没有libboost_system.a,这也是报错的原因之一。

解决方案

方案1:修改CMake配置,适配现有库命名

在CMakeLists.txt中添加以下设置,让FindBoost忽略自动生成的标签,直接匹配你的库文件名:

# 禁用自动添加编译器标签
set(Boost_COMPILER "")
# 指定Boost库目录
set(BOOST_LIBRARYDIR "/home/hiisi/workspace/boost-1_75_0/lib")
# 移除未编译的system组件
find_package(Boost COMPONENTS program_options iostreams)

方案2:重新编译Boost,生成符合CMake预期的命名

修改编译命令,让b2生成带标准标签的库文件:

emconfigure ./b2 toolset=emscripten-clang link=static runtime-link=static threading=multi --prefix=/home/hiisi/workspace/boost-1_75_0 --with-program_options --with-iostreams --with-filesystem --with-system

(添加--with-system来编译你需要的system组件)

方案3:跳过FindBoost,手动链接库

如果不想折腾FindBoost的匹配逻辑,可以直接手动指定包含目录和库:

set(BOOST_INCLUDE_DIR "/home/hiisi/workspace/boost-1_75_0")
set(BOOST_LIB_DIR "/home/hiisi/workspace/boost-1_75_0/lib")
include_directories(${BOOST_INCLUDE_DIR})
link_directories(${BOOST_LIB_DIR})

# 在目标链接阶段添加库(替换成你的实际目标名)
target_link_libraries(你的目标名 PRIVATE libboost_program_options.a libboost_iostreams.a)

内容的提问来源于stack exchange,提问作者Larry Kosher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:50:35