CMake学习笔记4
- 格式:doc
- 大小:81.50 KB
- 文档页数:7
cmake基本常用语法CMake是一种跨平台的构建系统,它用于生成Makefile或其他构建文件,从而简化项目的构建过程。
CMake具有易于使用、可读性强、可定制性高等特点,被广泛应用于开源和商业项目中。
本文将介绍CMake的基本常用语法,帮助读者更好地理解和使用CMake。
1.CMake简介CMake起源于2000年,由Kitware公司开发。
它采用一种声明式的构建语言,允许用户通过简单的配置文件来定义项目的结构和编译设置。
CMake支持多种编程语言,如C、C++、Fortran等,并可以轻松地实现跨平台构建。
2.CMake基本语法CMake的配置文件采用了一种特殊的脚本语言,称为CMakeLists.txt。
在该文件中,可以使用以下基本语法:- 命令:使用`add_xxx()`、`set_xxx()`等方法来定义项目结构和编译设置。
- 变量:使用`set(XXX XXX)`来设置变量,其中XXX为变量名,XXX为变量值。
- 列表:使用`list(XXX XXX)`来定义包含多个值的列表。
- 条件语句:使用`if()`、`else()`、`endif()`来实现条件编译。
3.配置文件编写配置文件主要包括以下几个部分:- 设置项目名称、版本等信息:使用`project()`命令。
- 设置C++标准:使用`set(CMAKE_CXX_STANDARD xxx)`。
- 添加源文件:使用`add_executable()`等命令。
- 设置编译器选项:使用`set(CMAKE_XXX xxx)`。
- 设置链接器选项:使用`set(CMAKE_XXX xxx)`。
- 添加依赖库:使用`target_link_libraries()`命令。
4.构建流程在CMake中,构建流程分为以下几个步骤:- 创建CMakeLists.txt文件。
- 运行CMake,生成构建文件(如Makefile)。
- 使用构建文件(如Makefile)进行构建。
cmake 条件判断CMake是一个跨平台的开源构建工具,用于管理软件项目的构建过程。
在CMake中,条件判断是一种常用的技术,用于根据不同的情况选择不同的代码路径或设置不同的编译选项。
本文将介绍CMake中的条件判断的基本语法和常见用法,并通过示例代码来说明其具体应用。
一、条件判断的基本语法在CMake中,条件判断使用if语句来实现。
if语句的基本语法如下所示:if(<condition>)<commands>elseif(<condition>)<commands>else()<commands>endif()其中,<condition>是一个表达式,用于判断条件是否成立。
如果条件成立,则执行<commands>中的代码;否则跳过该代码块。
elseif语句用于添加额外的条件判断分支,else语句用于添加默认情况下的代码块。
二、条件判断的常见用法1. 判断变量是否定义在CMake中,可以使用if语句来判断一个变量是否已经定义。
示例代码如下:```if(DEFINED <variable>)<commands>endif()```其中,<variable>是需要判断的变量名。
2. 判断变量是否为空在CMake中,可以使用if语句来判断一个变量是否为空。
示例代码如下:```if(<variable>)<commands>endif()```其中,<variable>是需要判断的变量名。
3. 判断变量是否相等在CMake中,可以使用if语句来判断两个变量是否相等。
示例代码如下:```if(<variable1> STREQUAL <variable2>)<commands>endif()```其中,<variable1>和<variable2>是需要判断的两个变量名。
CC++从零开始的cmake教程C/C++从零开始的CMake教程如果你有过在linux系统上源码安装某款软件的经历,那么肯定对这三部曲⼀点都不会陌⽣——配置(configure)、编译(make)、安装(make install)。
⼏乎每次都是机器⼈般的操作,这背后其实是make(准确地说应该是GNU Make)在默默为你⼲了不少活。
1.编译hello.c——单⼀源⽂件的编译//hello.c#include <stdio.h>int main(){puts("hello, world!");return 0;}为了编译⽣成对应的可执⾏⽂件,你可能会使⽤下⾯的命令:$ cc -o hello hello.c$ ./hellohello, world!但是,如果使⽤make(前提是你的操作系统已经安装了GCC和GNU Make),会显得更清爽⼀些。
$ make hellocc hello.c -o hello$ ./hellohello, world!1.1编写Makefile什么?你连“make hello”都懒得写?看完这部分,你的“妄念”应该就能实现了,到时候你只需要慢悠悠地打出4个字母——”make”,然后按下回车键,⽐图形界⾯IDE还要⽅便(⾄少你不⽤到处去找那个该死的“运⾏”按钮在哪。
这时候你只要在hello.c的同⼀个⽬录下新建⼀个⽂件Makefile作为make命令的配置⽂件即可。
它的内容很简单:hello:1.2设定编译器什么?你不想使⽤默认的cc,⽽想使⽤gcc来编译程序?那还不简单,只⽤在Makefile⽂件中把CC变量的值赋为gcc就可以了。
CC := gcchello:如果你这时候想运⾏make试下效果,请注意:make根本就不会重新编译⽣成hello。
为什么啊?因为make很“懒”,因为它检测到hello.c和上⼀次编译时⼀模⼀样,再重新编译⽣成的可执⾏⽂件肯定也⼀样啊,那就没有运⾏的必要了,直接返回结果了。
超详细的cmake⼊门教程什么是cmake你或许听过好⼏种 Make ⼯具,例如 GNU Make ,QT 的 qmake ,微软的 MSnmake,BSD Make(pmake),Makepp,等等。
这些 Make ⼯具遵循着不同的规范和标准,所执⾏的 Makefile 格式也千差万别。
这样就带来了⼀个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。
⽽如果使⽤上⾯的 Make ⼯具,就得为每⼀种标准写⼀次 Makefile ,这将是⼀件让⼈抓狂的⼯作。
CMake CMake附图 1 CMake就是针对上⾯问题所设计的⼯具:它⾸先允许开发者编写⼀种平台⽆关的 CMakeList.txt ⽂件来定制整个编译流程,然后再根据⽬标⽤户的平台进⼀步⽣成所需的本地化 Makefile 和⼯程⽂件,如 Unix 的 Makefile 或Windows 的 Visual Studio ⼯程。
从⽽做到“Write once, run everywhere”。
显然,CMake 是⼀个⽐上述⼏种 make 更⾼级的编译配置⼯具。
⼀些使⽤ CMake 作为项⽬架构系统的知名开源项⽬有 VTK、ITK、KDE、OpenCV、OSG 等。
在 linux 平台下使⽤ CMake ⽣成 Makefile 并编译的流程如下:1. 编写 CMake 配置⽂件 CMakeLists.txt 。
2. 执⾏命令 cmake PATH 或者 ccmake PATH ⽣成 Makefile。
其中, PATH 是 CMakeLists.txt 所在的⽬录。
(ccmake 和cmake 的区别在于前者提供了⼀个交互式的界⾯)3. 使⽤ make 命令进⾏编译。
⼊门案例:单个源⽂件本节对应的源代码所在⽬录:Demo1。
对于简单的项⽬,只需要写⼏⾏代码就可以了。
例如,假设现在我们的项⽬中只有⼀个源⽂件 ,该程序的⽤途是计算⼀个数的指数幂。
《CMake实践》笔记⼀:PROJECTMESSAGEADD_EXECUTABLE前⾔:开发了5,6年的时间,如果没有KDE4,也许不会有⼈或者Linux发⾏版本重视cmake,因为除了Kitware似乎没有⼈使⽤它。
通过KDE4的选型和开发,cmake逐渐进⼊了⼈们的视线,在实际的使⽤过程中,cmake的优势也逐渐的被⼤家所认识,⾄少KDE的开发者们给予了cmake极⾼的评价,同时庞⼤的KDE项⽬使⽤cmake来作为构建⼯具也证明了cmake的可⽤性和⼤项⽬管理能⼒。
所以,cmake应该感谢KDE,也正因为如此,cmake的开发者投⼊了KDE从autotools到cmake的迁移过程中,并相当快速和顺利的完成了迁移,现在整个KDE4开发版本全部使⽤cmake构建。
这也是促使我们学习cmake的原因,⾸先cmake被接受并成功应⽤,其次,cmake的优势在实际使⽤中不断的体现出来。
我们为什么不来认识⼀下这款优秀的⼯程构建⼯具呢?在2006年KDE⼤会,听cmake开发者当⾯介绍了cmake之后,我就开始关注cmake,并将cmake纳⼊了Everest发⾏版,作为系统默认组件。
最近QT-4.3也正式进⼊了Everest系统,为KDE4构建完成了准备⼯作。
但是,在学习cmake的过程中,发现官⽅的⽂档⾮常的少,⽽且错误也较多,⽐如:在介绍Find<Name>模块编写的⽂档中,模块名称为FOO,但是后⾯却出现了Foo_FIND_QUIETLY的定义,这显然是错误的,这样的定义永远不可能有效,正确的定义是FOO_FIND_QUIETLY。
种种原因,促使我开始写⼀份“⾯向使⽤和实⽤”的cmake⽂档,也就是本教程《Cmake实践》(Cmake Practice)本⽂档是边学习边编写的成果,更像是⼀个学习笔记和Tutorial,因此难免有失误或者理解不够透彻的地⽅,⽐如,我仍然不能理解为什么绝⼤部分使⽤变量的情况要通过${}引⽤,⽽在IF语句中却必须直接使⽤变量名。
∙最大的Qt4程序群(KDE4)采用cmake作为构建系统∙Qt4的python绑定(pyside)采用了cmake作为构建系统∙开源的图像处理库opencv 采用cmake 作为构建系统∙...看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看:例子一单个源文件main.c例子二==>分解成多个main.c hello.h hello.c例子三==>先生成一个静态库,链接该库例子四==>将源文件放置到不同的目录例子五==>控制生成的程序和库所在的目录例子六==>使用动态库而不是静态库例子一一个经典的C程序,如何用cmake来进行构建程序呢?//main.c#include <stdio.h>int main(){printf("Hello World!/n");return 0;}编写一个CMakeList.txt 文件(可看做cmake的工程文件):project(HELLO)set(SRC_LIST main.c)add_executable(hello ${SRC_LIST})然后,建立一个任意目录(比如本目录下创建一个build子目录),在该build目录下调用cmake∙注意:为了简单起见,我们从一开始就采用cmake的out-of-source 方式来构建(即生成中间产物与源代码分离),并始终坚持这种方法,这也就是此处为什么单独创建一个目录,然后在该目录下执行cmake 的原因cmake .. -G"NMake Makefiles"nmake或者cmake .. -G"MinGW Makefiles"make即可生成可执行程序hello(.exe)目录结构+|+--- main.c+--- CMakeList.txt|/--+ build/|+--- hello.execmake 真的不太好用哈,使用cmake的过程,本身也就是一个编程的过程,只有多练才行。
cmake使用示例与整理总结一、概述CMake是一种跨平台的开源构建系统,它可以自动生成各种不同平台的构建文件,如Makefile或Visual Studio项目文件。
使用CMake 可以简化项目的构建过程,提高开发效率。
本文将介绍CMake的基本使用方法以及实际应用示例,并对常见问题进行总结。
二、安装与配置1. 下载安装CMake:从官网下载对应操作系统的安装包,安装完成后在命令行输入“cmake --version”确认是否安装成功。
2. 配置环境变量:将CMake的bin目录添加到PATH环境变量中。
三、基本使用方法1. 编写CMakeLists.txt文件:该文件描述了项目的结构和依赖关系,以及如何生成可执行文件或库。
2. 创建build目录:在项目根目录下创建一个build目录,并进入该目录。
3. 运行cmake命令:在build目录下运行“cmake ..”命令,表示将上级目录(即项目根目录)作为源代码路径,并生成相应的构建文件。
4. 构建项目:运行“make”或“cmake --build .”命令进行项目构建。
如果是Windows系统,则可以使用Visual Studio打开生成的.sln文件进行编译。
四、实际应用示例以下是一个简单的示例程序:```#include <stdio.h>int main(){printf("Hello, CMake!\n");return 0;}```该程序可以通过以下CMakeLists.txt文件进行构建:```cmake_minimum_required(VERSION 3.10)project(hello_cmake)add_executable(hello_cmake main.c)```在项目根目录下创建一个build目录,并进入该目录,运行“cmake ..”命令生成构建文件。
然后运行“make”或“cmake --build .”命令进行项目构建。
Cmake 学习笔记三接前面的Cmake学习笔记(一)与Cmake学习笔记(二)继续学习cmake 的使用。
学习一下cmake的finder。
finder是神马东西?当编译一个需要使用第三方库的软件时,我们需要知道:去哪儿找头文件 .h 对比GCC的-I 参数去哪儿找库文件(.so/.dll/.lib/.dylib/...) 对比GCC的-L 参数需要链接的库文件的名字对比GCC的-l 参数这也是一个finder 需要返回的最基本的信息。
如何使用?比如说,我们需要一个第三方库curl,那么我们的CMakeLists.txt 需要指定头文件目录,和库文件,类似:include_directiories(/usr/include)target_link_libraries(myprogram curl)如果借助于cmake提供的finder会怎么样呢?使用cmake的Modules目录下的FindCURL.cmake,相应的CMakeList.txt 文件:find_package(CURL REQUIRED)include_directories(${CURL_INCLUDE_DIR})target_link_libraries(curltest ${CURL_LIBRARY})或者find_package(CURL)if(CURL_FOUND)include_directories(${CURL_INCLUDE_DIR})target_link_libraries(curltest ${CURL_LIBRARY})else(CURL_FOUND)message(FATAL_ERROR "curl not found!")endif(CURL_FOUND)如果我们使用的finder,不是cmake自带的怎么办?∙放置位置:工程根目录下的cmake/Modules/∙然后在CMakeList.txt 中添加set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}"${CMAKE_SOURCE_DIR}/cmake/Modules/")find_package如何工作find_package 将会在module路径下查找Find<name>.cmake。
《CMake实践》学习笔记一、CMake的特点1、开放源代码,使用类BSD许可发布。
/HTML/Copyright.html2、跨平台,并可生成native编译配置文件,在Linux/Unix平台,生成makefile,在苹果平台,可以生成xcode,在Windows平台,可以生成MSVC的工程文件。
3、能够管理大型项目,KDE4就是最好的证明。
4、简化编译构建过程和编译过程。
CMake的工具链非常简单:cmake+make。
5、高效虑,按照KDE官方说法,CMake构建KDE4的kdelibs要比使用autotools来构建KDE3.5.6的kdelibs快40%,主要是因为CMake在工具链中没有libtool。
6、可扩展,可以为CMake编写特定功能的模块,扩充CMake功能。
二、初试CMake – CMake的helloworld实验1:单个程序文件的CMake1、在/backup/CMake/t1目录建立main.c和CMakeLists.txt(注意文件名大小写)main.c文件内容:#include <stdio.h>int main(){printf("Hello World from t1 Main!\n");return 0;}CMakeLists.txt文件内容:project (hello)set(SRC_LIST main.c)message(STATUS "This is BINARY dir " ${hello_BINARY_DIR})message (STATUS "This is SOURCE dir "${hello_SOURCE_DIR})add_executable (hello ${SRC_LIST})2、开始构建Linux下命令:①cmake . (注意命令后面的点号,代表本目录)系统自动生成了:CMakeFiles, CMakeCache.txt, CMake_install.CMake等文件,并且生成了Makefile。
cmake常用指令CMake常用指令CMake是一个跨平台的开源构建工具,用于管理软件构建过程。
它通过使用CMake语言来描述构建过程,然后生成相应的构建系统。
在使用CMake时,我们可以通过一些常用的指令来完成各种构建任务。
本文将介绍一些常用的CMake指令,帮助读者更好地理解和使用CMake。
一、添加源文件和头文件在使用CMake构建项目时,首先需要将源文件和头文件添加到项目中。
CMake提供了几个常用的指令来完成这个任务。
1.1 add_executableadd_executable指令用于将源文件添加到项目中,并生成可执行文件。
它的语法如下所示:```add_executable(<executable_name> <source_files>)```其中,`<executable_name>`是生成的可执行文件的名称,`<source_files>`是源文件的列表。
1.2 add_libraryadd_library指令用于将源文件添加到项目中,并生成静态库或动态库。
它的语法如下所示:```add_library(<library_name> <library_type> <source_files>) ```其中,`<library_name>`是生成的库的名称,`<library_type>`可以是STATIC(静态库)或SHARED(动态库),`<source_files>`是源文件的列表。
1.3 include_directoriesinclude_directories指令用于添加头文件的搜索路径。
它的语法如下所示:```include_directories(<directory>)```其中,`<directory>`是头文件的搜索路径。
关于catkin_make的⼀些学习笔记(持更)(此博⽂为新⼿⾃学笔记,只是浅显理解并不保证准确性,后期有更深⼊的了解会更新内容,欢迎指正博⽂中的错误~)添加⾃定义的头⽂件1. 习惯上,在该package⽬录下新建include⽂件夹,专门存放头⽂件,⽐如:PACKAGE_NAME / include / Library_name / HEAD_1.h2. 头⽂件中函数或者类的具体实现放在.cpp⽂件中,习惯与节点源码放在⼀起,⽐如:PACKAGE_NAME / src / HEAD_1.cpp3. 在CmakLists.txt中添加库:catkin_package(...INCLUDE_DIRS includeLIBRARIES Library_name...)add_library(Library_namesrc/HEAD_1.cppsrc/HEAD_2.cpp...} 4.库编译完后,在其他.cpp中如果⽤到了这个库,就可以在编译的时候添加这个库的链接:add_executable(node_name src/node_name.cpp)add_dependencies(node_name Library_name)target_link_libraries(node_name Library_name ${catkin_LIBRARIES} )C++11与PCL库冲突问题 1. 我的ROS版本为indigo,PCL库版本 1.7,gcc版本是4.8.4(gcc只有4.7及以上的版本才⽀持c++11的编译格式) 2. 如果代码⾥有c++11格式的语句,⽐如:for (auto p:cloud.points){// 将点云⾥的点插⼊到octomap中tree.updateNode( octomap::point3d(p.x, p.y, p.z), true );} 则在编译的时候,应在CMakeLists.txt中加⼊SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 3.经过测试,⾮ROS⼯作空间中,使⽤cmake .. / make ⽅式编译,编译格式是否为c++11与pcl并没有冲突,但是如果在ROS⼯作空间中, ⽤catkin_make编译时,如果编译格式设置为c++11,则有些⽤到pcl的时候会出现报错:段错误(核⼼已转储)segmentation fault (core dumped) 例如我遇到的⼀个情况: 在⼀个ROS-package中,因为要对点云进⾏滤波操作(),新建remove_outliers.cpp,其中包含头⽂件#include <pcl/filters/radius_outlier_removal.h>#include <pcl/filters/conditional_removal.h> 同时我的CMakeLists.txt中之前设置了编译格式为⽀持c++11(SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")), 使⽤catkin_make编译通过后,⼀旦rosrun该节点,直接出现“段错误(核⼼已转储)”,去掉这俩头⽂件,便可以正常运⾏节点,但是也⽆法做滤波了。
CMake学习笔记⼆:cmake常⽤变量和常⽤环境变量1 cmake 变量引⽤的⽅式使⽤ ${} 进⾏变量的引⽤。
在 IF 等语句中,是直接使⽤变量名⽽不通过 ${} 取值。
2 cmake ⾃定义变量的⽅式主要有隐式定义和显式定义两种,举⼀个隐式定义的例⼦,就是 PROJECT 指令,他会隐式的定义<projectname>_BINARY_DIR 和<projectname>_SOURCE_DIR 两个变量。
⽽显式定义的例⼦,可以使⽤ SET 指令,就可以构建⼀个⾃定义变量了。
3 cmake 常⽤变量1,PROJECT_BINARY_DIR如果是 in source 编译,这个变量指得就是⼯程顶层⽬录,如果是 out-of-source 编译,指的是⼯程编译发⽣的⽬录。
另外<projectname>_BINARY_DIR 和 CMAKE_BINARY_DIR 跟这个变量指代的内容是⼀致的。
2,PROJECT_SOURCE _DIR不论采⽤何种编译⽅式,都是⼯程顶层⽬录。
也就是在 in source 编译时,他跟 PROJECT_BINARY_DIR 等变量⼀致。
另外<projectname>_SOURCE_DIR 和 CMAKE_SOURCE_DIR 跟这个变量指代的内容是⼀致的。
3,CMAKE_CURRENT_SOURCE_DIR指的是当前处理的 CMakeLists.txt 所在的路径。
4,CMAKE_CURRRENT_BINARY_DIR如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR ⼀致,如果是 out-ofsource 编译,他指的是 target 编译⽬录。
使⽤ADD_SUBDIRECTORY(src bin) 可以更改这个变量的值。
5,CMAKE_CURRENT_LIST_FILE输出调⽤这个变量的 CMakeLists.txt 的完整路径。
词法和语法在开始本节的学习之前,我们先总结一下之前所了解到的CMake基本词法和命令。
CMake命令通常使用如下的格式:1. COMMAND( ARG1 ARG2 … )复制代码命令关键字之后使用括号来包含所有的参数;各个参数之间使用空格或者换行符分隔;而参数通常有以下几种形式:变量,以${MY_VAIRABLE}的形式表达,其储存类型为字符串类型,但是可以根据具体命令的要求自动转换为布尔型、整型或者浮点类型。
变量可以出现在字符串中,也可以实现“内省”。
变量有用户自定义和系统内置两种,用户自定义变量使用SET命令设置;而系统变量由系统自动赋值,例如${PROJECT_SOURCE_DIR}。
枚举量,例如ADD_LIBRARY可以设置要生成的链接库为SHARED或者STATIC,还可以设置为MODULE(插件,可动态调用,但不作为其他工程的依赖),除此之外的赋值都是不能被识别的。
值,也就是任意的字符串内容,它可以用来指示要编译的源代码文件名,也可以表达一段文字提示信息,或者表达特定的功能。
值可以使用引号进行标识,多数情况下也可以不用。
前文中我们已经了解到的命令列举如下,此外这里还简要地介绍了另一些可能在各类CMake 工程中遇到的命令及其语法格式。
CMake部分命令的语法歌是十分复杂,这里仅仅介绍它的某一种实现形式,建议读者阅读CMake的帮助文档以获取更多信息。
括号中为该命令的一个或多个参数项,其中使用“[…]”包含的项表示可忽略项,使用“…|…”分隔的项表示只能选择其中一项。
ADD_CUSTOM_COMMAND(TARGET namePRE_BUILD|PRE_LINK|POST_BUILDCOMMAND cmd1 [COMMAND cmd2 …] ):为目标工程name添加一个或多个新的自定义的编译规则cmd1,cmd2等,执行时机可以选择编译前,链接前或者编译后。
它的作用相当于Visual Studio工程的“Custom Build Step”属性。
cmake中使用函数【原创实用版】目录1.CMake 简介2.CMake 中的函数分类3.CMake 函数的使用方法4.常用 CMake 函数介绍5.总结正文1.CMake 简介CMake 是一个跨平台的构建系统,可以用于创建、构建和维护软件项目。
它使用 CMakeLists.txt 文件来定义项目结构和构建设置。
CMake 能够自动处理依赖关系,生成构建文件,并根据不同平台和编译器进行相应的调整。
2.CMake 中的函数分类CMake 提供了丰富的函数来支持各种构建需求。
这些函数主要分为以下几类:- 变量函数:用于设置和获取变量的值。
- 条件函数:用于根据特定条件执行不同的代码块。
- 逻辑函数:用于实现复杂的逻辑控制。
- 文件函数:用于处理文件和目录。
- 消息函数:用于输出提示信息。
3.CMake 函数的使用方法在 CMakeLists.txt 文件中,可以使用 CMake 函数来定义项目的构建设置。
函数的使用方法如下:```cmake_minimum_required(VERSION 3.0) # 设置 CMake 最低版本要求project(MyProject) # 定义项目名称set(CMAKE_CXX_STANDARD 11) # 设置 C++标准set(CMAKE_CXX_STANDARD_REQUIRED True) # 使 C++标准设置为必需if(UNIX AND NOT APPLE) # 判断是否为非苹果的 Unix 系统find_package(Boost REQUIRED COMPONENTS system filesystem) # 查找并安装 Boost 库endif()add_executable(MyProject main.cpp) # 添加可执行文件目标```4.常用 CMake 函数介绍以下是一些常用的 CMake 函数及其用法:- `set()`:用于设置变量值。
cmake笔记
以下是一份 cmake的学习笔记,希望对你有所帮助:
CMake是一种广泛使用的项目构建工具,它通过特有的语法规则生成对应的Makefile 文件,然后通过自带的工具链进行各种操作。
CMake支持大写、小写和大小写混合命令,参数之间使用空格或跨行分隔。
在使用CMake 时,需要在CMakeLists.txt文件中定义项目的编译规则、编译选项等信息。
下面是一个简单的CMakeLists.txt示例:
```
cmake_minimum_required(VERSION 3.24)
project(FirstProgram)
add_executable(hello.exe main.cpp)
```
在这个示例中,`cmake_minimum_required`命令用于设置CMake所需的最低版本;`project`命令用于定义项目名称;`add_executable`命令用于添加可执行文件,其中hello.exe是可执行文件的名称,main.cpp是源文件的名称。
通过学习CMake的基本语法和常用命令,可以更加高效地管理项目构建过程。
如需了解更多关于CMake的信息,请参考相关文档或教程。
C++学习笔记String的size操作返回的是string::size_type类型的值。
Vector的size()返回相应的vector类定义的size_type的值。
使用size_type类型时,必须指出该类型是在哪里定义的:vector<int>::size_type数组下标类型是size_t。
两个指针做减法操作:ptrdiff_t n = ip2 – ip; //结果为标准库类型的ptrdiff_t类型第一章快速入门C++中必须有一个命名为main的函数(返回值类型必须是int型),操作系统通过main函数的返回值来确定程序是否执行成功。
GUN编译器的默认命令是g++ 如:g++ –o prog1endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer),通过刷新缓存区,用户可以立即看到写入到流中的输出。
std::cout ::为作用域操作符,表示使用的是定义在命名空间std中的cout。
如果不能保证读取变量之前重置变量,就应该初始化变量。
C++注释采用/**/,注释不能嵌套。
While语句,for语句,if语句标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号””括起来。
成员函数是由类定义的函数,有时候称为类方法。
当调用成员函数时,通常指定函数要操作的对象,语法是使用点操作符(.)。
编译能查出的普遍错误:语法错误,类型错误,声明错误。
第二章变量和基本类型C++算术类型:bool char wchar_t short int long float double long double两个相邻的仅由空格,制表符,或换行符分开的字符串字面值可连接成一个新的字符串。
初始化:C++支持两种初始化变量的形式:复制初始化(=)和直接初始化(()),直接初始化效率更高。
如:Int ival(1024);int ival = 1024;初始化不是赋值,初始化指创建变量并给它赋初始值,而赋值是擦除对象的当前值并用新的值代替。
cmake 常用语句CMake是一个用于跨平台构建和管理软件项目的工具。
以下是一些CMake中常用的语句和用法:1. "project"语句:project(project_name)用于定义项目的名称,可以在CMakeLists.txt文件的开头使用。
2. "add_executable"语句:add_executable(executable_name source_files)用于将源代码文件编译为可执行文件。
3. "add_library"语句:add_library(library_name source_files)用于构建静态库或共享库。
4. "target_link_libraries"语句:target_link_libraries(target_name library_name)用于将特定的库链接到目标文件中。
5. "include_directories"语句:include_directories(directory)用于添加包含文件的目录。
6. "set"语句:set(variable value)用于设置变量的值。
7. "if"语句:if(condition)# codeelse()# codeendif()用于条件判断和执行不同的代码块。
8. "foreach"语句:foreach(variable range)# codeendforeach()用于遍历一个范围内的变量。
9. "cmake_minimum_required"语句:cmake_minimum_required(VERSION version)用于指定CMake的最低版本要求。
10. "find_package"语句:find_package(package_name)用于搜索和加载特定的软件包。
apiextractor 的CMakeList.txt文件走马观花include(icecc.cmake)包含一个文件,其内容比较简单(如果找到分布式编译器icecc,则使用它)project(apiextractor)cmake_minimum_required(VERSION 2.6)find_package(Qt4 4.5.0 REQUIRED)find_package(LibXml2 2.6.32)find_package(LibXslt 1.1.19)常规内容,依赖Qt4(必须),LibXml2,LibXslt 3个软件包option(DISABLE_DOCSTRINGS "Disable documentation extraction." FALSE) option(BUILD_TESTS "Build tests." TRUE)option(INSTALL_TESTS "Install tests" FALSE)option(ENABLE_VERSION_SUFFIX "Used to use current version in suffix to generated files. This is used to allow multiples versions installed simultaneous." FALSE)4个选项if (NOT DISABLE_DOCSTRINGS)if (NOT LIBXSLT_FOUND OR NOT LIBXML2_FOUND)set(DISABLE_DOCSTRINGS TRUE)message(WARNING "libxslt and/or libxml not found, disabling support to doc strings!")endif()endif()如果没有禁用DOCSTRINGS,但是没有找到LibXml2和LibXslt,同样禁用if(MSVC)set(CMAKE_CXX_FLAGS "/Zc:wchar_t- /GR /EHsc /DWIN32 /D_WINDOWS /D_SCL_SECURE_NO_WARNINGS")elseif(CMAKE_HOST_UNIX)option(ENABLE_GCC_OPTIMIZATION "Enable specific GCC flags to optimize library size and performance. Only available on Release Mode"0)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall-fvisibility=hidden")set(CMAKE_CXX_FLAGS_DEBUG "-g")if(ENABLE_GCC_OPTIMIZATION)set(CMAKE_BUILD_TYPE Release)set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -Os-Wno-strict-aliasing -Wl,-O1")if (NOT CMAKE_HOST_APPLE)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-Wl,--hash-style=gnu")endif()endif()if(NOT CMAKE_HOST_APPLE)set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR}/symbols.filter") endif()endif()为MSVC、UNIX等分别设置一些选项if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release)endif()如果没有设置构建类型,则使用Releaseif(BUILD_TESTS)set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/tests)endif ()如果需要构建测试程序,则设置库文件输出目录为tests子目录set(apiextractor_MAJOR_VERSION 0)set(apiextractor_MINOR_VERSION 10)set(apiextractor_MICRO_VERSION 0)set(apiextractor_VERSION"${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION}.${ap iextractor_MICRO_VERSION}")configure_file(apiextractorversion.h.in${CMAKE_CURRENT_BINARY_DIR}/apiextractorversion.h @ONLY)set(apiextractor_SOVERSION${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION})设置版本号,并使用配置文件(只替代@VAR@这样的变量)set(QT_USE_QTCORE 1)set(QT_USE_QTXML 1)include(${QT_USE_FILE})add_definitions(${QT_DEFINITIONS})add_definitions(-DQT_PLUGIN)add_definitions(-DQT_SHARED)add_definitions(-DRXX_ALLOCATOR_INIT_0)Qt的常规设置if(ENABLE_VERSION_SUFFIX)set(apiextractor_SUFFIX"-${apiextractor_MAJOR_VERSION}.${apiextractor_MINOR_VERSION}")else()set(apiextractor_SUFFIX "")endif()控制是否需要后缀set(apiextractor_SRCapiextractor.cppabstractmetabuilder.cpp#omit ...)if (NOT DISABLE_DOCSTRINGS)set(apiextractor_SRC${apiextractor_SRC}docparser.cppdoxygenparser.cppqtdocparser.cpp)set(APIEXTRACTOR_EXTRA_INCLUDES ${LIBXSLT_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})set(APIEXTRACTOR_EXTRA_LIBRARIES ${LIBXSLT_LIBRARIES} ${LIBXML2_LIBRARIES})else()set(APIEXTRACTOR_EXTRA_INCLUDES "")set(APIEXTRACTOR_EXTRA_LIBRARIES "")endif()将源文件名存入变量apiextractor_SRC,如果启用了DOCSTRINGS,则设置LibXslt和LibXml2的头文件路径和库set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE) 设置一个变量,稍后作为库文件安装路径qt4_add_resources(apiextractor_RCCS_SRC generator.qrc)qt4_automoc(apiextractor_SRC)Qt 常规设置,注意qt4_automoc 根据源文件中的#include "xxx.moc"来确定处理相应的头文件include_directories(${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR}${CMAKE_CURRENT_SOURCE_DIR}/parser${CMAKE_CURRENT_SOURCE_DIR}/parser/rpp${QT_INCLUDE_DIR}${APIEXTRACTOR_EXTRA_INCLUDES})add_library(apiextractor SHARED ${apiextractor_SRC}${apiextractor_RCCS_SRC})target_link_libraries(apiextractor ${APIEXTRACTOR_EXTRA_LIBRARIES} ${QT_QTCORE_LIBRARY} ${QT_QTXMLPATTERNS_LIBRARY}${QT_QTXML_LIBRARY})set_target_properties(apiextractor PROPERTIES VERSION ${apiextractor_VERSION}SOVERSION${apiextractor_SOVERSION}OUTPUT_NAME"apiextractor${apiextractor_SUFFIX}"DEFINE_SYMBOL APIEXTRACTOR_EXPORTS)设置头文件目录,添加库文件目标,设置目标属性(注意DEFINE_SYMBOL)# uninstall targetconfigure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake " "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE@ONLY)add_custom_target(uninstall "${CMAKE_COMMAND}" -P"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${apiextractor_VERSION}) add_custom_target(distCOMMAND mkdir -p "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}" &&git log > "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}/ChangeLog" &&git archive --prefix=${ARCHIVE_NAME}/ HEAD --format=tar --output="${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" &&tar -C "${CMAKE_BINARY_DIR}" --owner=root --group=root -r "${ARCHIVE_NAME}/ChangeLog" -f"${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" &&bzip2 -f9 "${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar" && echo "Source package created at${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2./n"WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})两个自定义的目标uninstall 和distset(root_HEADERSapiextractormacros.habstractmetalang.hapiextractor.hgraph.hreporthandler.htypesystem.hfileout.hdocparser.hqtdocparser.hinclude.htypedatabase.h)将文件放于变量root_HEADERS,稍后会用在install中。