CMake基础

1、cmake特点

  1. 基本语法格式:指令(参数1 参数2 …)
    。参数用括号括起来;
    。参数之间用空格和分号分开;

  2. 指令是大小写无关,参数和变量是大小写敏感的

    set(HELLO hello.cpp)   #set变量
    add_executable(hello main.cpp hello.cpp)
    ADD_EXECUTABLE(hello main.cpp ${HELLO})  #这一句和上一句一样
    
  3. 使用${}方式取值,但是在if控制语句直接使用变量名

2、cmake重要指令

  1. cmake_minimum_required() 指定CMake最小版本

    #语法
    cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
    #示例 cmake最小版本2.8
    cmake_minimum_required(VERSION 2.8)
    
  2. project() 定义工程名称,并可以指定工程支持语言

    #语法
    project(projectName [CXX] [C] [Java])
    #示例  指定工程名HELLOWORLD
    project(HELLOWORLD)
    
  3. set()显式定义变量

    #语法
    set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    #示例 定义SRC变量,其值为sayhello.cpp hello.cpp
    set(SRC sayhello.cpp hello.cpp)
    
  4. include_directories() 向工程添加多个特定的头文件搜索路径 “头文件目录” ,相当与指定g++编译器的-I参数

    #语法
    include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
    #示例  将/usr/include /usr/local/include ./include添加到头文件搜索路径
    include_directories(/usr/include /usr/local/include ./include)
    
  5. link_directories() 向工程添加多个特定的库文件搜索路径 “链接库目录” ,相当与指定g++编译器的-L参数

    #语法
    link_directories(dir1 dir2 ...)
    #示例  将/usr/lib  ./lib添加到库文件搜索路径
    link_directories(/usr/lib ./lib)
    
  6. add_library() 生成库(library)文件

    #语法
    add_library(libName [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 aource2 ...)
    #示例 通过变量SRC生成libhello.so共享(动态)库
    add_library(hello SHARED ${SRC})
    
  7. add_compile_options() 添加编译参数

    #语法
    add_compile_options(<option> ...)
    #示例
    add_compile_options(-wall -std=c++11 -o2)
    
  8. add_executable() 生成可执行文件

    #语法
    add_executable(exeName source1 source2 ...)
    #示例 main.cpp成可执行文件main
    add_executable(main main.cpp)
    
  9. target_link_libraries() 为target添加需要链接的共享(动态)库
    动态库需要链接,静态库编译时已经添加进去了

    #语法
    target_link_libraries(target library1<debug|optimized> library2...)
    #示例 将hello共享库链接到可执行文件main
    target_link_libraries(main hello)
    
  10. add_subdirectory() 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的位置

    #语法
    add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    #示例  添加src子目录,
    ##     src中需要有个CMakeLists.txt文件
    add_subdirectory(src)
    
  11. aux_source_directory() 发现一个目录下所有源代码文件并将列表存储在一个变量中,这个指令临时被用来构建源文件列表

    #语法
    aux_source_directory(dir VARIABLE)
    #示例
    #定义SRC变量,其值为当前目录下所有的源代码文件
    aux_source_directory(. SRC)
    #编译SRC变量所代表的源文件代码,生成main可执行文件
    add_executable(main ${SRC})
    

3、CMake常用变量

  1. CMAKE_C_FLAGS : gcc编译选项

  2. CMAKE_CXX_FLAGS: g++编译选项

    追加,“${CMAKE_CXX_FLAGS} ...”,类似bash的path=${path}:...
    
    # 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
  3. CMAKE_BUILD_TYPE 编译类型 (Debug, Release)

    # 设定编译类型为debug,调试时需要选择debug
    set(CMAKE_BUILD_TYPE Debug)
    # 设定编译类型为release,发布时选择release
    set(CMAKE_BUILD_TYPE Release)
    
  4. CMAKE_BINARY_DIR
    PROJECT_BINARY_DIR
    <projectname>_BINARY_DIR

    1.这三个变量指代的内容是一致的
    2.如果是in source build,指的就是工程顶层目录
    3.如果是out-of-source编译,指的是工程编译发生的目录
    4.PROJECT_BINARY_DIR跟其他指令稍有区别
    
  5. CMAKE_SOURCE_DIR
    PROJECT_SOURCE_DIR
    <projectname>_SOURCE_DIR

    1.这三个变量指代的内容也是一致的,不论采用何种编译方式,都是工程顶层目录
    2.也就是在in source build时,和CMAKE_BINARY_DIR等变量一致
    3.PROJECT_SOURCE_DIR跟其他指令稍有区别
    
  6. CMAKE_C_COMPILER: 指定C编译器

  7. CMAKE_CXX_COMPILER: 指定C++编译器

  8. EXECUTABLE_OUTPUT_PATH: 可执行文件输出的存放路径

  9. LIBRARY_OUTPUT_PATH: 库文件输出的存放路径

4、CMake编译工程

CMake目录结构:项目主目录存在一个CMakeLists.txt文件

两种方式设置编译规则:
1. 包含源文件的子文件夹**包含**CMakeLists.txt, 主目录的CMakeLists.txt通过add_subdirectory()添加子目录即可;
3. 包含源文件的子文件夹**未包含**CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt;
  1. 编译流程

    #主目录
    mkdir build
    cd build
    cmake ..  #生成Makefile文件
    make
    
  2. 两种构建方式
    (1)内部构建(in-source build):不推荐使用

    内部构建就是直接在CMakeLists.txt目录cmake .   生成一堆中间文件
    
    cmake .
    make
    

    (2) 外部构建(out-of-source build):推荐
    将编译输出文件与源文件放在不同目录

    mkdir build && cd build
    cmake ..
    make
    
上一篇:log4j2按日志级别输出到指定文件


下一篇:windows从零搭建googletest测试工程