CLion 交叉编译 “iostream is not found” 无法解析标准库头文件问题的优雅解决方法

摘要

CLion本身对CMake有着强大的支持,这一切支持的背后,都依赖着符号的索引以及头文件的查找。对于交叉编译的开发情景,CLion的默认设置显然不能满足需求,一旦配置不到位,那么就会面临"iostream is not found","vector is not found"等标准C++头文件找不到的问题。本文介绍了如何优雅的解决此类问题的方法。
如果喜欢或有不足之处,欢迎评论。

应用情景

编辑环境:CLion for Windows
构建环境:用于构建IMX8Mmini开发板的Docker容器

在Windows桌面环境通过Clion强大的远程开发调试功能,连接到docker的编译环境下。

问题描述

在完成基本的CLion工具链配置之后,“Hello world”交叉编译通过

#include <iostream>
#include <map>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

标准库头文件iostream和map下有红色波浪线,并且无法进入头文件查看,提示iostream is not found

解决办法

在CMakeLists.txt中进行人如下定义

  • 定义CMAKE_SYSROOT变量,指向嵌入式系统根目录
  • 定义CMAKE_FIND_ROOT_PATH变量,并包含嵌入式系统根目录路径

添加完成后的CMakeLists.txt内容如下

# cmake_minimum_required(VERSION <specify CMake version here>)
cmake_minimum_required(VERSION 3.10)

set(SYSROOT_PATH  /opt/myir-imx-xwayland/4.14-sumo/sysroots/aarch64-poky-linux)
set(CMAKE_SYSROOT "${SYSROOT_PATH}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT_PATH}" "${CMAKE_PREFIX_PATH}" "${TOOLCHAIN_PATH}")

# search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

project(demo LANGUAGES "CXX" "C")

set(CMAKE_CXX_STANDARD 14)

add_executable(demo main.cpp)

原理分析

要想CLion IDE可以正常解析,则符号所在的头文件目录要出现在工程窗口中->External Libraries->Header Search Paths中,如下图所示
在这里插入图片描述
而之前编译可以通过但是CLion无法解析,是因为之前只设置了CMAKE_SYSROOT变量,而未设置CMAKE_FIND_ROOT_PATH变量。

CMAKE_SYSROOT:作用于gnu工具链,添加--sysroot编译选项
CMAKE_FIND_ROOT_PATH变量,影响CLion头文件路径搜索,直至影响到IDE是否能正常解析符号。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐