从零开始 CMake 学习笔记 (G)compile-flags

从零开始 CMake 学习笔记 (G)compile-flags

开始前先默念三遍口诀:

  • Declare a target
  • Declare target’s traits
  • It’s all about targets

本系列主要根据GitHub上的 cmake-examples 项目进行翻译总结,同时对于不清晰的概念及函数进行查阅理解记录形成。

1 介绍

本节展示了如何在 CMake 项目中灵活使用编译标志。整体的文件架构如下所示:

1.1 文件树

G-compile-flags $ tree
.
├── CMakeLists.txt
├── main.cpp

1.2 文件简介

  • CMakeLists.txt - 包含了希望运行的 CMake 命令
cmake_minimum_required(VERSION 3.5)

// 设置默认的C++的编译标志
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEX2" CACHE STRING "Set C++ Compiler Flags" FORCE)

// 设置项目名称
project (compile_flags)

// 添加可执行文件
add_executable(cmake_examples_compile_flags main.cpp)

//对可执行二进制文件添加编译标志
target_compile_definitions(cmake_examples_compile_flags 
    PRIVATE EX3
)
  • main.cpp - main文件
#include <iostream>

int main(int argc, char *argv[])
{
   
   std::cout << "Hello Compile Flags!" << std::endl;

   // only print if compile flag set
#ifdef EX2
   std::cout << "Hello Compile Flag EX2!" << std::endl;
#endif

#ifdef EX3
   std::cout << "Hello Compile Flag EX3!" << std::endl;
#endif

   return 0;
}

2 概念解析

    首先,什么是编译标志? 首先,像我们在编译整个项目时,要用哪一个 C++/C 标准来来编译每个项目。CMake 中像我们提供了 CMAKE_CXX_FLAGSCMAKE_C_FLAGS 这样的标志来选择C++/C版本的编译标志。
    其次,对于大型的项目,如果我们想对提升代码的复用性,在使用不同编译标志时,分别执行不同的代码等等,那同样可以对不同的目标设置自己的编译标志,利用 target_compile_definitions() 这个函数。目前视野比较窄,暂时没想到其他用法。

2.1 设置不同目标的编译标志

在现代CMake中设置C ++标志的推荐方法是专门针对某个目标设置编译标志,可以通过target_compile_definitions() 函数设置某个目标的编译标志。

target_compile_definitions(cmake_examples_compile_flags
    PRIVATE EX3
)

上面的语句就是对 可执行二进制文件cmake_examples_compile_flags设置了编译标志 EX3 (如果在此之前它有默认编译标志的话,会继续追加,而不会更改!)。 PRIVATEPUBLICINTERFACE的含义与之前从零开始 CMake 学习笔记 (C)static-librarytarget_include_directories()函数中说过的一样,无非就是三种,我用你不能用我有我不用你用我用大家用,比较好理解。

2.1.1 target_compile_definitions拓展

主要作用是对个目标设置编译标志,完整参数展示如下:

target_compile_definitions(<target>
  <INTERFACE|PUBLIC|PRIVATE> [items1.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值