Skip to content

条件编译

分两种情况:

  1. 针对不同环境,在CMakeLists.txt中选择不同的配置选项;
  2. C++程序预定义宏,在C++程序中执行不同程序。

具体实现参考cmakes/condition/

CMake

CMakeLists.txt文件中的基本语法如下:

if(<condition>)
  <commands>
elseif(<condition>) # optional block, can be repeated
  <commands>
else()              # optional block
  <commands>
endif()

可以预设变量(文件中或者外部设置)、使用条件表达式等等方式实现。

  • 预设变量
set(CON1 OFF)

if (NOT CON1)
    MESSAGE(STATUS "con1 is ${CON1}")
endif ()
  • 条件表达式
set(CON1 OFF)
set(CON2 "con2")

if (CON1)
    MESSAGE(STATUS "con1 is ${CON1}")
elseif (CON2 MATCHES "con2")
    MESSAGE(STATUS "con2 is ${CON2}")
endif ()
  • 外部设置

CMakeLists.txt中编写

if (CON3)
    MESSAGE(STATUS "con3 is ${CON3}")
endif ()

新建脚本build.sh,编写

#!/bin/bash

set -eux

BUILD_DIR=build/
if [[ ! -d "${BUILD_DIR}" ]]; then
  mkdir -p ${BUILD_DIR}
fi

cd ${BUILD_DIR}
cmake -DCON3=ON ../
make
./condition

执行

$ /bin/bash /home/zj/repos/Deploy/cmakes/condition/build.sh
+ BUILD_DIR=build/
+ [[ ! -d build/ ]]
+ cd build/
+ cmake -DCON3=ON ../
-- The C compiler identification is GNU 7.5.0
。。。
。。。
-- con3 is ON
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zj/repos/Deploy/cmakes/condition/build
+ make
Scanning dependencies of target condition
[ 50%] Building CXX object CMakeFiles/condition.dir/main.cpp.o
[100%] Linking CXX executable condition
[100%] Built target condition
+ ./condition
Hello, World!

C++

C++也支持条件编译语法,可以在编译过程中设置宏常量,然后就可以在代码块中根据不同环境编译不同实现

#ifdef identifier 或者 #ifndef identifier
...
#elseif identifier
...
#else
...
#endif

C++代码如下:

// 条件一
#ifdef HAHA
    std::cout <<"Hello HAHA"<<std::endl;
#else
    std::cout << "Hello ..." << std::endl;
#endif
// 条件二
#ifdef AHAH
    std::cout << "Hello AHAH" << std::endl;
#endif

CMakeLists.txt中使用语句add_definition进行宏定义

add_definitions(-DAHAH -DHAHA)

上述命令类似于g++ -DAHAH -DHAHA main.cpp

执行结果如下:

Hello HAHA
Hello AHAH

相关阅读