美文网首页
CMake教程(3):添加版本号和头文件

CMake教程(3):添加版本号和头文件

作者: MemetGhini | 来源:发表于2021-11-08 00:51 被阅读0次

    在上一篇文章的基础上我们为可执行文件通过CMake添加版本号。首先用project命令设定项目的版本号。

    project(Hello VERSION 1.0)
    

    然后用configure_file命令把版本号传递到源代码中。该命令的作用是复制一个文件到另一个目录并替换@VAR@或者${VAR}为CMake中设定的值。我们为项目新增一个头文件叫Hello.h其内容为:

    #define Hello_STR @Hello_STR@
    #define Hello_VERSION_MAJOR @Hello_VERSION_MAJOR@
    #define Hello_VERSION_MINOR @Hello_VERSION_MINOR@
    

    并在CMakeLists.txt文件中设定Hello_STR的值

    set(Hello_STR "\"Hello World From CMake!\"")
    

    ps:set命令作用为为变量,缓存变量,环境变量赋值,本文中不详细探讨后面的文章中会专门讲解

    调用configure_file来生成目标头文件:

    configure_file(Hello.h Hello.h)
    

    configure_file 命令:
    第一个参数为输入文件目录,相对于CMAKE_CURRENT_SOURCE_DIR目录。也就是说相对于源码目录。
    第二个参数为替换内容后的输出文件目录,相对于CMAKE_CURRENT_BINARY_DIR目录。也就是说相对了编译目录。

    所以上面一行命令的作用为把根目录中的Hello.h里面@Hello_STR@, @Hello_VERSION_MAJOR@, @Hello_VERSION_MINOR@ 替换为具体的值并复制到build文件夹中。其中后面两项是设定project的版本号之后CMake自动生成,第一个我们用set命令设定了内容"Hello World From CMake!"
    生成了头文件之后我们还需要通过target_include_directories命令把目录设到头文件搜索目录中,否则会找不到头文件。

    target_include_directories(Hello PUBLIC ${PROJECT_BINARY_DIR})
    

    target_include_directories的第一个参数为可执行文件名,必须是add_executable() 或者 add_library() 设定的名字。因此该命令必须放在add_executable()后面否则执行出错,找不到项目。可执行文件名和项目名可以不一样,target_include_directories的参数再后面的文章中详细讲解

    所以完整的CMakeLists.txt文件为:

    cmake_minimum_required(VERSION 3.10)
    project(Hello VERSION 1.0)
    set(Hello_STR "\"Hello World From CMake!\"")
    configure_file(Hello.h Hello.h)
    add_executable(Hello Hello.cpp)
    target_include_directories(Hello PUBLIC ${PROJECT_BINARY_DIR})
    

    此时执行cmake ..命令构建后目录结构如下:

    .
    ├── CMakeLists.txt
    ├── Hello.cpp
    ├── Hello.h
    └── build
        ├── CMakeCache.txt
        ├── CMakeFiles
        ├── Hello.h
        ├── Makefile
        └── cmake_install.cmake
    

    细心一点的同学会发现,跟之前比这里多了一个Hello.h文件,其内容为:

    #define Hello_STR "Hello World From CMake!"
    #define Hello_VERSION_MAJOR 1
    #define Hello_VERSION_MINOR 0
    

    已经被CMakeLists.txt中的值替换了内容。再看看头文件是否引入成功,之前的Hello.cpp文件改为:

    #include <iostream>
    #include <Hello.h>
    
    int main() 
    {
        std::cout << Hello_STR << std::endl;
        std::cout << Hello_VERSION_MAJOR << std::endl;
        std::cout << Hello_VERSION_MINOR << std::endl;
        return 0;
    }
    

    备注:这里头文件用尖括号来引入,否则会从跟源文件同级目录搜索头文件,导致宏的内容跟预期不一致,是还没被替换的版。尖括号是预处理器以依赖于实现的方式搜索,通常在编译器预先指定的搜索目录中。
    构建和编译后执行可执行文件,执行结果为:

    > cmake ..
    > make
    > ./Hello
    Hello World From CMake!
    1
    0
    

    相关文章

      网友评论

          本文标题:CMake教程(3):添加版本号和头文件

          本文链接:https://www.haomeiwen.com/subject/hoayzltx.html