CMake默认环境变量及选择编译器和设置编译器选项

CMake内置变量与系统变量对应关系

变量名称CMake变量系统变量
C编译器CMAKE_C_COMPILERCC
C++编译器CMAKE_CXX_COMPILERCXX
生成器-G "*******"CMAKE_GENERATOR(CMAKE 3.15+才支持)
C编译选项CMAKE_C_FLAGSCFLAGS
C++编译选项CMAKE_CXX_FLAGSCXXFLAGS

一、设置编译器的版本

在实际的项目平台中可能安装有多个版本的编译器,可以通过如下两种方式设置编译器的版本

1、直接在命令行中指定编译器

cmake .. -DCMAKE_CXX_COMPILER=/usr/local/gcc/bin/g++

2、在cmake中指定编译器

  1. set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
  2. set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")

注:这两条命令应该放在文件的开始位置(cmake_minimum_required命令之下,其他命令之上),否则可能无效。

解释:

CMAKE_C_COMPILER
原本是保存环境变量"CC"值的变量,而CC是编译C语言的首选编译器。

CMAKE_CXX_COMPILER
CMAKE_C_COMPILER类似,不过这个变量对应的环境变量是CXX,是编译C++语言的编译器
生成的结果

二、设置编译参数

假设我们使用g++编译器,想添加"-std=c++11", “-Wall"”-Werror"等参数。

2.1 使用add_compile_options命令

通过在CMakeLists.txt文件中添加add_compile_options命令可以起到添加参数的作用,如:

add_compile_options(-std=c++11 -Wall -Werror)

但是这个命令是针对所有类型编译器的,也就是说这里添加的选项会在所有的编译器中运用,比如-std=c++11是针对C++的编译器参数,也会被运用在C语言编译器中。所以在编译c代码时,就会产生如下warning

  1. [ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-2.1/src/cdecode.c.obj
  2. cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
  3. [100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj
  4. cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
  5. Linking C static library libb64.a
  6. [100%] Built target b64

虽然不一定会报错但是终究体验感不好。要消除这个warning,就不能使用add_compile_options,而是只针对c++编译器添加这个option

2.2 通过设置CMAKE_CXX_FLAGS来配置

CMAKE_CXX_FLAGS是针对C++编译器的参数选项,默认保存环境变量CXX_FLAGS的内容,但是如果直接修改这个参数值,那么系统会忽略原CXX_FLAGS的内容。设置方式如下:

  1. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror")

这个变量只在当前文件有效,如果项目中有多个模块,多个编译文件,那么需在每一个CMakeLists.txt文件中都添加对应的命令和参数。

两种方式比较
https://i-blog.csdnimg.cn/blog_migrate/6c19c5b46add7f351ac5e58cb3e911c6.png

综上,对于一些在整个项目中通用的编译选项可以使用add_compile_options命令来添加比较方便,对于各个模块中的独立选项则使用CMAKE_CXX_FLAGS变量更好。

三、CMAKE__FLAGS变量

这里用到的CMAKE_CXX_FLAGS变量是只针对C++编译器的选项,对于其他编程语言,只要替换部分就可以,在当前cmake版本(3.17.2)中支持如下语言:

    CMAKE_C_FLAGSC语言编译器选项,对应于环境变量CFLAGS
    CMAKE_CXX_FLAGS
C++语言编译器选项,对应于环境变量CXXFLAGS
    CMAKE_CUDA_FLAGS
CUDA语言编译器选项,对应于环境变量CUDAFLAGS
    CMAKE_Fortran_FLAGS
Fortran语言编译器选项,对应于环境变量FFLAGS
 

四、实例

  1. # 判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
  2. if(CMAKE_COMPILER_IS_GNUCXX)
  3.     add_compile_options(-std=c++11)
  4.     message(STATUS "optional:-std=c++11")  
  5. endif(CMAKE_COMPILER_IS_GNUCXX)
  1. cmake_minimum_required(VERSION 3.5)
  2. project(eignface_demo)
  3. ## The common options using by both c and cxx
  4. set(COMPILE_FLAGS "-O2 -march=armv7-a -mcpu=cortex-a9 -mlittle-endian -mfloat-abi=soft -mno-sched-prolog -mno-unaligned-access -fPIC -fno-exceptions \
  5.     -fno-common -fno-inline -fno-omit-frame-pointer -fno-strict-aliasing -fno-merge-constants \
  6.     -freg-struct-return -fno-delete-null-pointer-checks -fstack-protector-strong -pipe\
  7.     -Wtrampolines -Wall -Wfloat-equal -Wshadow"
  8. )
  9. ## The options for the shared library
  10. set(LINK_FLAGS    "-rdynamic -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
  11. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lstdc++ -lm")
  12. set(OPENCV_LIB opencv_highgui opencv_objdetect opencv_core opencv_imgproc opencv_contrib)
  13. set(SRC_CPP EigenFace.cpp)
  14. set(GCC_PATH D:/code/mingw)
  15. if (HISI)
  16.     set(CMAKE_C_COMPILER $(GCC_PATH)/bin/gcc.exe)
  17.     set(CMAKE_CXX_COMPILER $(GCC_PATH)/bin/g++.exe)
  18.        set(TOOLCHAIN_DIR "/opt/hisi-linux-nptl/arm-hisiv100-linux/target")
  19.        set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
  20.        set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  21.        set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  22.        set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  23.     include_directories(./hisi_opencv/include/)
  24.     link_directories(./hisi_opencv/lib/)
  25.     message("-- Use hisi compile demo")
  26.     add_executable(eignface_hisi  ${SRC_CPP})
  27.     target_link_libraries(eignface_hisi ${OPENCV_LIB})
  28. else()
  29.     set(CMAKE_C_COMPILER "/usr/bin/gcc")
  30.     include_directories(./gcc_opencv/include/)
  31.     link_directories(./gcc_opencv/lib/)
  32.     message("-- Use gcc compile demo")
  33.     add_executable(eignface_gcc  ${SRC_CPP})
  34.     target_link_libraries(eignface_gcc ${OPENCV_LIB})
  35. endif()

 参考:

CMake进阶(一)设置编译选项_qinbo1234567890的博客-CSDN博客_cmake 设置编译顺序

cmake(5):选择编译器及设置编译器选项_翔底的博客-CSDN博客_cmake设置编译器
cmake:设置编译选项的讲究(add_compile_options和CMAKE_CXX_FLAGS的区别)_10km的博客-CSDN博客_cmake_cxx_flags

 

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
CMake中,有一些内置的变量可以用于配置环境。你可以在CMake官方文档中的找到完整的变量列表和说明。其中一些重要的变量是: 1. CMAKE_INSTALL_PREFIX:这个变量用来定义CMake默认的安装路径。如果没有明确指定CMake默认安装路径为/usr/local。 2. CMAKE_CURRENT_BINARY_DIR:这个变量保存了当前构建目录的路径。它可以方便地用于指定二进制文件的输出路径。 3. CMAKE_C_COMPILER:这个变量原本是保存环境变量"CC"的值的变量。"CC"是编译C语言的首选编译器。在CMake中,你可以通过修改这个变量来指定使用的C编译器。 除了上述变量外,CMake还提供了许多其他的环境变量,用于配置编译选项、库路径、头文件路径等等。你可以根据自己的需求来修改这些变量,以满足项目的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [(七)CMake变量及其设置](https://blog.csdn.net/weixin_39258979/article/details/110225829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [CMake默认环境变量选择编译器设置编译器选项](https://blog.csdn.net/fengyuyeguirenenen/article/details/129332955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值