; 第三条命令用于执行Makefile文件,编译程序,生成可执行文件; CMake的执行就是这么简单,其难点在于如何编写CMakeLists.txt文件,下面结合例子简单介绍CMakeLists.txt...CMakeLists.txt,"#"后面为注释的内容,CMake的命令全部为大写 第2行指定生成的工程名为test_math 第4行指定头文件目录为include 第8行指定源文件目录为src,并将其赋值给环境变量...CMakeLists.txt,"#"后面为注释的内容,CMake的命令全部为大写 第2行指定生成的工程名为test_math 第4行指定头文件目录为include 第8行指定源文件目录为src,并将其赋值给环境变量...该命令在参数 path* 指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR 中。...该命令在参数 path* 指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR 中。
“Make”是从程序的源文件中控制程序的可执行文件和其他非源文件的生成工具。 “Make”工具需要知道如何构建程序。它了解如何从名为“makefile”的文件构建程序。...这个makefile列出了每个非源文件以及如何从其他文件中计算它。编写程序时,应该为其编写一个makefile,以便可以使用“Make”来构建和安装程序。简单的东西!...对于程序中的每个非源文件,makefile指定了用于计算它的shell命令。...如果您不知道,您不能使用相同的编译器来构建所有不同类型的源。您可以在每次建立项目时手动执行,但这将是乏味和痛苦的。CMake为每种类型的目标调用正确的命令序列。...对于CMake,有两个步骤:首先,您需要设置构建环境(通过在构建目录中键入cmake 或运行某些GUI客户端)。
添加生成的文件和生成器(步骤 5) 在这一节当中,我们会告诉你如何将一个生成的源文件加入到应用程序的构建过程中。在此例中,我们会创建一个预先计算好的平方根的表,并将这个表编译到应用程序中去。...了解示例项目中各个主题如何协同工作将非常有帮助。示例的教程文档和源代码可在CMake源代码树的Help/guide/tutorial目录中找到。每个步骤都有其自己的子目录,其中包含可以用作起点的代码。...但是可以将CPack设置为同时捆绑多个构建目录,以构建一个包含同一项目的多个配置的软件包。 首先,我们需要构建一个名为multi_config的目录,该目录将包含我们要打包在一起的所有构建。...根目录中的 CMakeLists.txt : # 项目信息 project (Demo3) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory...子目录中的 CMakeLists.txt: # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(.
CMake 是一个跨平台的自动化建构系统,可以用简单的命令来控制软件编译过程。下面是一个关于如何使用 CMake 进行项目配置和编译的教程。...CMAKE_C_FLAGS: 为C代码添加了-pipe标志,并将C标准设置为C99。 CMAKE_CXX_FLAGS: 为C++代码添加了-pipe标志,并将C++标准设置为C++11。...递归地查找 src/c/math/ 目录及其子目录下所有的 .c 文件,并将这些文件的路径存储在 MATH_LIB_SRC 变量中。.../cmake-demo/maindemo cmake -B cmake-demo:用来初始化构建过程并生成构建系统文件,-B cmake-demo 表示构建路径为 cmake-demo,即生成的构建文件在...&& cd - cd cmake-demo && ctest && cd -:执行单元测试 cd cmake-demo:切换当前工作目录到 cmake-demo 构建目录; ctest:在构建目录中运行
内部构建方法中,cmake生成的中间文件和可执行文件都会存放在项目目录中;外部构建方法中,中间文件与可执行文件都存放在build目录中。 笔者强烈建议使用外部构建方法。...优点显而易见:最大限度的保持了代码目录的整洁,生成、编译与安装是不同于项目目录的其他目录中,在外部构建方法下,PROJECT_SOURCE_DIR指向目录与内部构建相同,为CMakeLists.txt所在根目录...CMAKE_INSTALL_PREFIX的值定义为/usr/local,如此在外部构建情况下执行make install命令时,make会将生成的可执行文件拷贝到/usr/local/bin目录下。...AUX_SOURCE_DIRECTORY 查找某个路径下的所有源文件,并将源文件列表存储到一个变量中。...SRC_LIST中的文件,并持续输出信息,信息内容是当前路径下所有源文件的名称。
更省事的方法是使用aux_source_directory命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。...(VERSION 2.8) # 项目信息 project (Demo2) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(....中的源文件需要编译成一个名称为Demo 的可执行文件。...根目录中的 CMakeLists.txt : # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project(Demo3) # 查找当前目录下的所有源文件...子目录中的 CMakeLists.txt: # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(.
add_executable:将名为main.cpp的源文件编译成一个名称为 cmakeLearn 的可执行文件。...2.多个源文件 2.1 同一目录,多个源文件 在1中的cmake添加下面这行: # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(....CMake 会将当前目录所有源文件的文件名赋值给变量 DIR_SRCS ,再指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 Demo 的可执行文件。...DIR_SRCS) 查找当前目录下的所有源文件,并将名称保存到 DIR_SRCS 变量。 2.2 多个目录,多个源文件 此时目录架构: ....Demo MathFunctions) 以此完成: 子目录添加 链接库添加 最后,在子目录下指定链接库名字: 子目录中的 CMakeLists.txt: # 查找当前目录下的所有源文件 # 并将名称保存到
add_executable:将名为 main.c 的源文件编译成一个名称为 Demo 的可执行文件 2、开始构建 所有的文件创建完成后,demo1目录中应该存在main.c和CMakeLists.txt...: # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project (demo2) # 查找目录下的所有源文件 并将名称保存到...中的源文件需要编译成一个名称为 demo 的可执行文件。...${EXTRA_LIBS} calc) endif (USE_MYCALC) # 查找当前目录下的所有源文件 并将名称保存到 DIR_SRCS 变量 aux_source_directory(....子目录中的 CMakeLists.txt # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(.
在本书的最后一章中,我们将结合前面章节中讨论的多个不同的构建块,并将其应用于一个实际项目。...我们很快将开始添加目标,以使构建更加充实。 如何同时允许传统配置和 CMake 配置 CMake 的一个非常好的特性是,我们可以在源代码目录之外构建,构建目录可以是任何目录,而不必是项目目录的子目录。...为了允许传统和 CMake 配置在一段时间内共存,一个典型的策略是将所有 CMake 代码收集在CMakeLists.txt文件中,并将所有辅助 CMake 源文件放在cmake子目录下。...在我们的示例中,我们不会引入cmake子目录,而是将辅助文件更靠近需要它们的目标和源文件,但我们会注意保持几乎所有用于传统 Autotools 构建的文件不变,只有一个例外:我们将对自动生成的文件进行少量修改...编译器标志的范围 在这个特定的示例项目中,所有源文件使用相同的编译标志。对于其他项目,我们可能更倾向于不全局定义编译标志,而是使用target_compile_options为每个目标单独定义标志。
它是如何工作的 这里的两个关键命令是enable_testing(),它为这个目录及其所有子文件夹(在本例中,整个项目,因为我们将其放在主CMakeLists.txt中)启用测试,以及add_test(...构建时间:这是当平台和工具本地的构建工具被调用时,在之前由 CMake 生成的平台和工具本地的构建脚本上。此时,编译器将被调用,目标(可执行文件和库)将在特定的构建目录中被构建。...安装时间:当从构建目录到安装位置安装目标、源文件、可执行文件和库时。 CPack 时间或打包时间:当我们打包我们的项目以供分发,无论是作为源代码还是二进制。...任何目标 在 add_custom_command 的同一目录中声明,即在同一个 CMakeLists.txt 中,并且使用输出中的 任何文件 作为其源文件,将在构建时被赋予生成这些文件的规则。...在本食谱中,我们将展示如何检测 OpenMP 4.5 标准中的任务循环功能,以便在 C++可执行文件中使用。我们将使用一个示例 C++源文件来探测编译器是否支持这样的功能。
1.设置编译器flags 例如:设置C++标准,显示所有警告。...例如,如果要使用C++11构建main.cpp,而只构建库,则可能希望将其构建为C++14。...(${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11") 可以从以下手册中查看大量的属性,每个属性都可以用于满足您的特定需求...GNU GCC 链接选项 https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html GCC链接器默认情况下可以在环境变量中定义的目录(/usr/lib;/..."${CMAKE_EXE_LINKER_FLAGS} -Wl") 了解如何使用这些标志可以帮助您更好地控制可执行文件的链接行为。
…) add_subdirectory – 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置 # 添加src子目录,src中需有一个CMakeLists.txt add_subdirectory...(src) 语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) aux_source_directory – 发现一个目录下所有的源代码文件并将列表存储在一个变量中...,这个指令临时被用来自动构建源文件列表 # 定义SRC变量,其值为当前目录下所有的源代码文件 aux_source_directory(....CMakeLists.txt通过add_subdirectory添加子目录即可; 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中;...build):推荐使用 将编译输出文件与源文件放到不同目录中 ## 外部构建 # 1.
} -std=c++17 -pthread") # 查找当前目录显得所有源文件 #并将名称保存到DIR_SRCS的变量中 aux_source_directory(....中的源文件需要编译成一个名称为Demo2的可执行文件。...MyMath 子目录中的 CMakeLists.txt: # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(....EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 查找当前目录显得所有源文件 #并将名称保存到DIR_SRCS的变量中 aux_source_directory...修改MyMath 子目录中的 CMakeLists.txt:* # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(.
更省事的方法是使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。...(VERSION 2.8) # 项目信息 project (Demo2) # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(....中的源文件需要编译成一个名称为 Demo 的可执行文件。...查找当前目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(....子目录中的 CMakeLists.txt: # 查找当前目录下的所有源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(.
在 src 目录中有多个目录对于大型项目来说非常有用。但如果你只是构建一个可执行文件或库,你可以跳过它们,并将源文件直接存储在 src 中。...图 3.4 – CMake 如何将列表文件合并到一个项目中 在图 3.4中,每个框代表了一个位于特定目录中的CMakeLists.txt文件列表,而草体字中的标签代表了每个文件执行的动作(从上到下)。...CMake 允许你节省时间并跳过那些食谱的中间步骤;它在更高的抽象级别上工作。它理解如何直接从源文件构建可执行文件。所以,你不需要编写显式的食谱来编译任何对象文件。...,并且我们已经知道如何在实践中使用可执行目标——在生成步骤中,CMake 将创建一个构建系统并为其填充编译每个源文件并将它们链接在一起成一个单一的二进制可执行文件的食谱。...一种诱惑可能是使用GLOB模式的file()命令——它可以收集子目录中的所有文件并将它们存储在一个变量中。
指定项目的名称 指定需要的 CMake 的最低版本 将 dir 目录下的所有源文件的名字保存在变量中 指定从一组源文件编译出一个可执行文件且命名 指定从一组源文件 source1 source2 …...sourceN 编译出一个库文件且命名 指定某个目标(可执行文件或者库文件)依赖于其他的目标 添加一个需要进行构建的子目录 指定 target 需要链接 设定变量的值为 移除变量 输出信息 设定目录...---- CMake 脚本基本语法 注释 # 这是注释 ---- 指令 CMake script 由一连串的指令 (command) 组成,每个指令可有零至多个参数。...(VERSION 2.8) ---- 将 dir 目录下的所有源文件的名字保存在变量中 命令语法:aux_source_directory( ) 使用范例:aux_source_directory...add_subdirectory(src) # 定义一个SRC_LIST变量,存放该目录下所有的源文件 aux_source_directory(.
安装 进入cmake官网下载页[1] 下载zip包或安装器,安装后,将cmake的bin目录加入PATH环境变量中,命令行输入cmake --version检查环境是否配置成功 简单示例 以上面的代码为例...例如add_executable (main2 add.c sub.c mul.c div.c main.c) 外部构建 在上面的示例中,执行cmake命令会在源码工程的目录下生成很多无法自动删除的中间文件或临时文件...如果是内部构建,则编译目录与工程根目录相同,如果是外部构建,则表示外部构建创建的编译目录,如上例中的build目录 CMAKE_CURRENT_SOURCE_DIR 表示当前处理的CMakeLists.txt...设置目标的一些属性,从而改变构建方式 link_directories添加库的搜索路径 aux_source_directory查找指定路径下的所有源文件 综合实例调整上面示例工程的结构,在工程根目录下创建四个文件夹...# 递归遍历当前目录下的所有.c .cpp后缀名的文件,并将结果列表保存到SRC_LIST变量中 FILE(GLOB_RECURSE SRC_LIST *.c *.cpp) # 打印 message (
其中main.c是我们要编译的源文件,CMakeLists.txt是关键,他就是告诉cmake如何编译。可以理解为编译的规则。...SOURCE_LIST 中定义的源文件列表 内部构建和外部构建 在上面的例程中,我们是采用的内部构建,会看到cmake生成的临时文件比我们编写的源文件还要多,而且在同一级目录下。...答案是采用外部构建。 外部构建简单理解就是将cmake生成的中间文件与源文件分离。不让他们同一级目录。...:~/rice_file/cmake$ 过程:创建目录build,然后在build目录下执行cmake,将构建的中间文件生成到build下,这样源文件就很干净。...(同样随便写点内容,目的是为了规范) 将构建后的目标可执行文件(rice)放入构建目录的bin目录。
/lib/libCd.so 使用下面的CMakeLists.txt文件,目标是编译当前目录和./other目录下的所有源文件,并链接./lib目录下的相应库文件到最终的可执行文件....message(${MY_VAR}) 构建类型 cmake默认支持多种构建类型(build type),每种构建类型都有专门的编译参数变量,详情见下表[1]: CMAKE_BUILD_TYPE 对应的...) 查找源文件 查找当前目录下所有的源文件并保存到SRC_LIST变量里 aux_source_directory(....SRC_LIST) 查找src目录下所有以cmake开头的文件并保存到CMAKE_FILES变量里 file(GLOB CMAKE_FILES "src/cmake*") file命令同时支持目录递归查找.../lib ) 添加生成目标 使用SRC_LIST源文件列表里的文件生成一个可执行文件hello add_executable(hello ${SRC_LIST}) 使用SRC_LIST源文件列表里的文件生成一个静态链接库
# 编译 main.cpp 生成可执行文件 main add_excutable(main main.cpp) target_link_libraries : 为目标可执行文件添加需要的共享库 # 将...hello动态库文件链接到可执行文件main target_link_libraries(main hello) add_subdirectory : 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置...# 添加src子目录,src中需要有一个 CMakeLists.txt add_subdirectory(src) aux_source_directory : 发现一个目录下所有的源代码文件并将列表存储在一个变量中...,这个指令临时被用来自动构建源文件列表。...# 定义 SRC 变量,其值为当前目录下所有的源代码文件 aux_source_directory(.
领取专属 10元无门槛券
手把手带您无忧上云