[C++][CMake][生成可执行文件][下]详细讲解

2024-07-08 1293阅读

目录

  • 1.搜索文件
    • 1.aux_source_directory
    • 2.file
    • 2.包含头文件
    • 3.变量操作
      • 1.追加
        • 1.使用set拼接
        • 2.使用list拼接
        • 2.字符串移除
        • 3.list其他操作
        • 4.宏定义
        • 5.预定义宏

          1.搜索文件

          • 如果一个项目里边的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实
          • CMake提供了搜索文件的命令,可以使用aux_source_directory命令或者file命令

            1.aux_source_directory

            • 在CMake中使用aux_source_directory命令可以查找某个路径下的所有源文件
            • 语法:
              • dir:要搜索的目录
              • variable:将从dir目录下搜索到的源文件列表存储到该变量中
                aux_source_directory( )
                
              • 示例:
                aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
                

                2.file

                • file除了搜索以外还可以做其他事情
                • 语法:
                  • GLOB:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中
                  • GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中
                    file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
                    
                  • 示例:
                    file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
                    
                  • CMAKE_CURRENT_SOURCE_DIR宏表示当前访问的CMakeLists.txt文件所在的路径

                    2.包含头文件

                    • 在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译
                    • 在CMake中设置要包含的目录也很简单,通过include_directories即可
                    • 语法:
                      include_directories( [ ...])
                      

                      3.变量操作

                      1.追加

                      • 有时候项目中的源文件并不一定都在同一个目录中,但是这些源文件最终却需要一起进行编译来生成最终的可执行文件或者库文件,如果通过file命令对各个目录下的源文件进行搜索,最后还需要做一个字符串拼接的操作
                      • 关于字符串拼接可以使用set命令也可以使用list命令

                        1.使用set拼接

                        • 语法:
                          set(变量名1 ${变量名1} ${变量名2} ...)
                          
                        • 本质:从第二个参数开始往后所有的字符串进行拼接,最后将结果存储到第一个参数中,如果第一个参数中原来有数据会对原数据就行覆盖
                        • 示例:
                          cmake_minimum_required(VERSION 3.0)
                          project(TEST)
                          set(TEMP "DieSnowK")
                          file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
                          file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
                          # 追加(拼接)
                          set(SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
                          message(STATUS "message: ${SRC_1}")
                          

                          2.使用list拼接

                          • list命令的功能比set要强大,字符串拼接只是它的其中一个功能,所以需要在它第一个参数的位置指定出要做的操作,APPEND表示进行数据追加,后边的参数和set就一样了
                          • 语法:
                            list(APPEND  [ ...])
                            
                          • 示例:
                            cmake_minimum_required(VERSION 3.0)
                            project(TEST)
                            set(TEMP "DieSnowK")
                            file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
                            file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
                            # 追加(拼接)
                            list(APPEND SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
                            message(STATUS "message: ${SRC_1}")
                            
                          • 在CMake中,使用set命令可以创建一个list,一个在list内部是一个由分号;分割的一组字符串
                            • 例如:set(var a b c d e)命令将会创建一个list:a;b;c;d;e,但是最终打印变量值的时候得到的是abcde
                              set(tmp1 a;b;c;d;e)
                              set(tmp2 a b c d e)
                              message(${tmp1}) # 输出结果 abcde
                              message(${tmp2}) # 输出结果 abcde
                              

                              2.字符串移除

                              • 在通过file搜索某个目录就得到了该目录下所有的源文件,但是其中有些源文件并不是所需要的,需要从搜索到的数据中剔除出去,想要实现这个功能,也可以使用list
                                • 删除和追加数据类似,只不过是第一个参数变成了REMOVE_ITEM
                                • 语法:
                                  list(REMOVE_ITEM   [ ...])
                                  
                                • 注意:通过file命令搜索源文件的时候得到的是文件的绝对路径(在list中每个文件对应的路径都是一个item,并且都是绝对路径),那么在移除的时候也要将该文件的绝对路径指定出来才可以,否是移除操作不会成功
                                • 示例:
                                  cmake_minimum_required(VERSION 3.0)
                                  project(TEST)
                                  file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/*.cpp)
                                  # 移除前日志
                                  message(STATUS "message: ${SRC_1}")
                                  # 移除 main.cpp
                                  list(REMOVE_ITEM SRC_1 ${PROJECT_SOURCE_DIR}/main.cpp)
                                  # 移除后日志
                                  message(STATUS "message: ${SRC_1}")
                                  

                                  3.list其他操作

                                  • 获取list的长度
                                    • 语法
                                      list(LENGTH  )
                                      
                                    • 参数:
                                      • LENGTH:子命令LENGTH用于读取列表长度
                                      • :当前操作的列表
                                      • :新创建的变量,用于存储列表的长度
                                      • 读取列表中指定索引的的元素,可以指定多个索引
                                        • 语法:
                                          list(GET   [ ...] )
                                          
                                        • 参数:
                                          • :当前操作的列表
                                          • int a = 10; #ifdef DEBUG printf("Pikachu~\n"); #endif for(int i=0; i printf("DieSnowK\n"); } return 0; }
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]