CMake学习笔记4

合集下载

cmake基本常用语法

cmake基本常用语法

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中,条件判断是一种常用的技术,用于根据不同的情况选择不同的代码路径或设置不同的编译选项。

本文将介绍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教程

CC++从零开始的cmake教程

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入门教程

超详细的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

《CMake实践》笔记一:PROJECTMESSAGEADD_EXECUTABLE

《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语句中却必须直接使⽤变量名。

cmake学习笔记

cmake学习笔记

∙最大的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使用示例与整理总结

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学习笔记3

CMake学习笔记3

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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中。

相关文档
最新文档