如何将CMakeLists.txt功能集成到ToolChain.cmake以链接C++库
问题根因
直接粘贴CMakeLists内容到ToolChain.cmake报错的核心原因是混淆了两类CMake文件的职责边界:
ToolChain.cmake是CMake在项目初始化最早期加载的配置,仅用于定义编译器、全局编译/链接flags、全局工具路径这类基础工具链配置,此时CMake还未完成编程语言的初始化流程,不支持执行project()、add_executable()、find_package()、add_subdirectory()这类属于项目构建阶段的命令- 你自行编写的CMakeLists.txt属于项目构建逻辑,本身就不应该放到ToolChain.cmake中
正确集成步骤
- 保留ToolChain.cmake的工具链属性,仅在其中补充全局级的必要配置:
# 原有工具链配置保留 set(CMAKE_C_COMPILER /usr/bin/clang-8) set(CMAKE_CXX_COMPILER /usr/bin/clang++-8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3 -DNDEBUG" CACHE STRING "" FORCE) # 仅补充全局通用配置,不要加项目构建相关命令 # 注意:你原本CMakeLists用的C++11和工具链默认的C++14要统一,建议以工具链的C++14为准,避免ABI兼容问题 set(CMAKE_CXX_STANDARD 14 CACHE STRING "" FORCE) set(CMAKE_CXX_STANDARD_REQUIRED ON CACHE BOOL "" FORCE)
- 将你编写的项目构建逻辑,放到原有软件根目录的CMakeLists.txt对应位置,或者作为子模块引入:
# 原有项目CMakeLists的原有逻辑保留,在合适的位置添加以下内容 add_executable(osi_messages_test src/TCP_Client.cpp) find_package(Protobuf REQUIRED) add_subdirectory(open-simulation-interface) get_directory_property(OSI_VERSION_MAJOR DIRECTORY open-simulation-interface DEFINITION VERSION_MAJOR) set(OSIVERSION "${OSI_VERSION_MAJOR}.${OSI_VERSION_MINOR}.${OSI_VERSION_PATCH}") target_link_libraries(osi_messages_test open_simulation_interface)
- 按原README指定的方式执行cmake命令即可,注意要清空之前错误生成的CMake缓存文件,使用独立的build目录存放构建产物,避免和源码混布:
rm -rf build && mkdir build && cd build cmake \ -G "Ninja" \ -DCMAKE_BUILD_TYPE=Client \ -DLIBCARLA_BUILD_RELEASE=ON \ -DLIBCARLA_BUILD_DEBUG=OFF \ -DLIBCARLA_BUILD_TEST=OFF \ -DCMAKE_TOOLCHAIN_FILE=/path/to/ToolChain.cmake \ -DCMAKE_INSTALL_PREFIX=/path/to/install-folder \ /path/to/carla-root-folder ninja install
报错补充说明
你排查到的构建目录问题确实是触发报错的原因之一:非build目录如果残留旧的CMake缓存、CMakeSystem.cmake文件,会导致工具链加载逻辑异常,触发递归调用、编译器未设置的错误,每次配置前清空build目录即可避免这类问题。
内容的提问来源于stack exchange,提问作者thbake
相关产品推荐
相关产品推荐

