CLion 交叉编译 “iostream is not found“ 无法解析标准库头文件问题的优雅解决方法
CLion 交叉编译 “iostream is not found” 无法解析标准库头文件问题的优雅解决方法摘要CLion本身对CMake有着强大的支持,这一切支持的背后,都依赖着符号的索引以及头文件的查找。对于交叉编译的开发情景,CLion的默认设置显然不能满足需求,一旦配置不到位,那么就会面临"iostream is not found","vector is not found"等标准C++
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是否能正常解析符号。
更多推荐
所有评论(0)