本文建立在在上一篇文章的基础上 《编译安装GCC11.2 包教包会》,展示了如何让CMake使用自定义工具链,在低版本gcc机器上使用高版本gcc,例如在RHEL 7.9系统(默认gcc 4.8.5)上使用gcc 11.2的方法。
请注意,以下内容能够工作的前提是:高版本的gcc已经正确安装在/opt/toolchains
目录下。
编写CMake工具链定义文件
具体内容很简单,如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /opt/toolchains/bin/gcc)
set(CMAKE_CXX_COMPILER /opt/toolchains/bin/g++)
set(CMAKE_FIND_ROOT_PATH /opt/toolchains)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_INSTALL_RPATH "/opt/toolchains/lib64")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/opt/toolchains/lib64 -lc -lstdc++")
- 因为我们的目标平台就是Linux,所以
CMAKE_SYSTEM_NAME
设置为Linux; CMAKE_C_COMPILER
和CMAKE_CXX_COMPILER
这两个变量定义了工具链的C/C++编译器可执行文件的位置;CMAKE_FIND_ROOT_PATH
定义了工具链的根目录位置,本例中是/opt/toolchains(如果不明白建议看上一篇文章);- 其他的都是根据工具链编译需要的参数;需要注意的是,
CMAKE_INSTALL_RPATH
设置为libstdc++.so
的位置,并且将CMAKE_BUIL_WITH_INSTALL_RPATH
设置为TRUE
,这样就可以在CMake编译后,将可执行文件的rpath设置为INSTALL_RPATH
,无需修改环境变量即可直接运行编译后的程序;
修改VSCode中CMakeTools插件的配置
vscode作为宇宙最强编辑器,在使用自定义工具链的时候也能提供强大的支持。默认情况下,自定义工具链不会被CMakeTools插件找到,需要修改插件的配置,具体方式如下:
- Ctrl + Shift + P 打开命令面板;
- 输入CMake,在下方的列表中,找到
CMake: Edit User-Local CMake Kits
这一行 - 在弹出的
cmake-tools-kits.json
配置文件中,追加一个配置项:
注意,此处我将自定义工具链定义文件{ "name": "gcc 12.1.0", "toolchainFile": "/usr/include/gcc12.cmake" },
gcc12.cmake
放置在了/usr/include
目录下,便于查找。 - 最后,重新打开命令面板,找到
CMake: Configure
按钮,即可弹出所有可用的工具链,其中就有刚才添加的自定义工具链,并且在CMake配置阶段就能发现,默认的C/C++编译器已经切换到自定义工具链路径下的编译器了。 - 注意,如果在
CMake: Configure
后,vscode提示找不到<optional>
或者<variant>
之类的C++17才有的头文件,需要手动切换一下intellisense的方式。同样打开命令面板,输入intellisense,在下方提示中找到C/C++: Select IntelliSense Configuration
命令,点击,选择Use CMake Tools
,让插件帮我们确定intellisense的头文件目录。
至此,vscode也可以完美支持自定义工具链下的代码编辑和开发了。