当前位置:首页 > Java入门 > 正文内容

cmake cdash(cmake cpack)

abcsky887个月前 (10-26)Java入门98

本文分享给大家的是:

原标题:必读干货|使用Cmake管理C++项目简明教程一、背景Cmake是 kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开源项目其官方网站是 cmake.org,可以通过访问官方网站获得更多关于cmake的信息。

cmake cdash(cmake cpack)

它是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。CMake能够输出makefile文件,然后系统会根据这个makefile文件内容编译整个工程。

图1 kitware公司和Cmake套件软件开发有以下三个步骤:1.编译源代码;2.链接到其他库;3.将应用程序打包为库或二进广告推广报价制文件假如我们有一个大型的C++项目,由非常多的互相调用的工程共同组成,一些用于生成库文件,一些用于实现逻辑功能。

他们之间的调用关系复杂而严格,如果想在这样复杂的框架下进行二次开发,显然只拥有它的源码是远远不够的,还需要清楚的明白这几十个项目之间的复杂关系即使是原作者给出了相关的结构文档,对新手来说建立工程的过程依旧是漫长而艰辛的,开发人员的核心业务是软件开发,而不是软件构建。

Cmake目的是实现软件构建流程的自动化,并且是跨平台的原作者只需要生成一份CMakeLists.txt文档,框架的使用者们只需要在下载源码的同时下载作者提供的CMakeLists.txt,就可以利用CMake,在原作者广告推广报价的帮助下进行工程的搭建。

Cmake编写的过程实际上是编程的过程,不过你需要编写的是 CMakeLists.txt(一般情况下每个目录一个),使用的是“Cmake”语言和语法刚入门的开发者拿到Cmakelist看着一脸雾水,里面众多的语法指令不知道是什么含义甚至不能自己修改,本文接下来将介绍Cmakelist的各种重要的变量、指令、语句及其作用。

图2 Cmake的构建流程二、安装大多数Linux的操作系统会在系统中直接包含,不必手动安装其他操作系统,比如:Windows或者某些Linux系统,可以从Cmake官网上下载安装包进行安装:cmake.org/HTML/Download。

安装步骤省略,广告推广报价可以借鉴网上其他资料三、使用因为cmake会生成一些中间文件(CMakeFiles,CMakeCache.txt, cmake_install.cmake, Makefile),所以最好在项目源代码目录重新建一个文件夹存放生成的中间文件,即外部编译。

在中间文件夹中依次执行编译指令cmake ..,make,那么编译器会按照生成的Makefile中的指令编译C++工程如果要对编译的结果清理,使用make clean 指令即可在 Windows 上,还可以使用 CMakeSetup (GUI)进行工程构建。

make install命令将编译好的目标文件默认直接安装到/usr/local目录,如果想广告推广报价安装到其他目录,可以使用make install DESTDIR=本文接下来介绍Cmakelist的编写方法,这是开发者最关心的地方。

Cmakelist编写指令时不区分大小写,为了统一风格,本文使用大写字母四、基础指令要编译非常简单的C++工程,工程不依赖第三方库,那么Cmakelist中至少包含以下内容:#声明要求的最低Cmake版本

CMAKE_MINIMUM_REQUIRED(VERSIN 2.8)#Cmake工程名这个指令隐式的定义了两个 cmake变量: PROJECT_BINARY_DIR以及PROJECT_SOURCE_DIR。

分别指向项目的编译路径和工程路径PROJECT (HE广告推广报价LLO)#生成可执行文件,${}来引用变量ADD_EXECUTABLE(Executable program name ${ Source files })。

到这里,一个可执行程序就生成了如果要管理依赖第三方库的工程,就需要加入一些额外指令除此之外,还有一些Cmake中重要的变量和语句需要掌握,才能使用起来得心应手在下面列出:五、重要的变量#Cmake版本CMAKE_SYSTEM_VERSION

#可执行文件的输出路径EXECUTABLE_OUTPUT_PATH#库文件输出路径LIBRARY_OUTPUT_PATH#安装路径CMAKE_INSTALL_PREFIXNote:该变量可以在Cmake广告推广报价list中显式地定义,即:SET(CMAKE_INSTALL_PREFIX );也可以作为命令行参数传递:cmake -DCMAKE_INSTALL_PREFIX= ;还可以在cmake完成后使用make install DESTDIR=指定安装路径。

#工程编译时存放二进制文件的目录CMAKE_BINARY_DIR#将添加的头文件搜索路径放在已有路径的前面CMAKE_INCLUDE_DIRECTORIES_BEFORE#将添加的头文件搜索路径放在已有路径的后面。

CMAKE_INCLUDE_DIRECTORIES_ AFTER#工程顶层目录CMAKE_SOURCE_DIR#定义自己的 cmake广告推广报价模块所在的路径CMAKE_MODULE_PATH#控制库的默认编译方式

BUILD_SHARED_LIBS#设置 C++/C的编译选项,也可以通过指令 ADD_DEFINITIONS()添加CMAKE_CXX_FLAGS/ CMAKE_CXX_FLAGSNote:该指令非常重要,因为它能选择C++/C工程的编译器行为。

有时候我们依赖的第三方库的编译方式与自己项目的编译方式不一致时,编译会通过,但是运行时出现非常隐蔽的bug此时就需要检查,项目中各种库的编译行为是否一致# 设置构建类型,类型选项有Debug/Release。

当使用GDB调试工程时要使用Debug选项该变量可以通过命令行:cmake广告推广报价 ­DCMAKE_BUILD_TYPE=Release或指令SET(CMAKE_BUILD_TYPE [type])设置CMAKE_BUILD_TYPE

六、重要的指令和语句#查看Cmake生成的详细编译信息,相当于执行make VERBOSE=1当构建失败并且需要找出原因时使用该条指令非常有帮助SET(CMAKE_VERBOSE_MAKEFILE on )。

#显式的为变量赋值,非常重要SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])#用来寻找第三方库的Find.cmake模块,该模块里提供了库的头文件路径和库文件路径。

如果找不到,通过设置 CMAK广告推广报价E_MODULE_PATH 变量来告诉 Cmake 在哪里找到它FIND_PACKAGE( [major.minor] [QUIET] [NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]])

Note:编译一个链接第三方库的软件时,我们需要知道该库的头文件路径、库文件路径、要链接的库的文件名使用第三方库时必须在Cmakelist中提供这些信息#向终端输出用户定义的信息,显示状态信息、警告或错误。

包含了三种类型:SEND_ERRO、SATUS、FATAL_ERRORMESSAGE([SEND_ERROR | STATUS | FATAL_ERROR]广告推广报价 "message to display"...)

例:MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})#添加可执行文件ADD_EXECUTABLE( IMPORTED [GLOBAL])

#向当前工程添加存放源文件的子目录,并指定中间二进制和目标二进制存放的位置ADD_SUBDIRECTORY(source_dir [binary_dir] )#生成库生成的库的类型有三种:SHARED,动态库;STATIC,静态库;MODULE,在使用 dyld的系统有效。

ADD_LIBRARY(libname [SHARED|STATIC|MOD广告推广报价ULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)#设置输出目标的属性SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)

例:设置目标库的名称:SET_TARGET_PROPERTIES(taget_name PROPERTIES OUTPUT_NAME "hello")#设置动态库的版本号,VERSION指代动态库版本,SOVERSION指代 API版本。

SET_TARGET_PROPERTIES(hello PROPERTIE广告推广报价S VERSION 1.2 SOVERSION 1)#向工程添加多个特定的头文件搜索路径系统默认的头文件路径是/usr/include和/usr/local/include,如果不是,需要在Cmakelist中显式的定义。

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)#将目标文件链接到第三方库,非常重要的语句TARGET_LINK_LIBRARIES(target library1 library2...)

#在指定路径中搜索文件名,指定路径指的是环境变量CMAKE_INCLUDE_PATH中包含的所有路径FIND_PATH(广告推广报价filename)#向 C/C++编译器添加-D定义修改预处理器设置ADD_DEFINITIONS()。

#定义 target依赖的其他 target,确保在编译本 target之前,其他的 target已经被构建ADD_DEPENDENCIES()#搜索一个目录下所有的源代码文件并将列表存储在一个变量,可以与ADD_EXECUTABLE连用。

AUX_SOURCE_DIRECTORY(. SRC_LIST)ADD_EXECUTABLE(main ${SRC_LIST})#if语句, 如果表达式内容不是:空,0,N, NO, OFF, FALSE, NOTFOUND或_NOTFOUND时,表达式为广告推广报价真。

IF(expression)…..ELSE(expression)…..ENDIF(expression)#列表变量遍历语句FOREACH(loop_var)...ENDFOREACH(loop_var)

#while语句WHILE(condition)...ENDWHILE(condition)本文提到的变量、语句、指令包含了Cmakelist编写时最常见、最重要的部分,编写Cmake的过程其实就是编程的过程。

返回搜狐,查看更多责任编辑:

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/324.html

分享给朋友:

“cmake cdash(cmake cpack)” 的相关文章

java面试题为什么都那么难做(java面试为什么要笔试)

本文分享给大家的是: java面试为何那么难“面试造火箭、工作拧螺丝”,曾经这么一句调侃的话总是用来形容IT行业中的面试情况作为一个流浪的程序猿,多年以来作为应聘者也好、面试官也罢,渐渐感受到java开发的面试不再仅仅在“造火箭”那么容易。 我的就职历程五年前的java面试...

java八股文面试题有公司问吗?(java八股文面试题百度云)

本文分享给大家的是: 文章目录Java内存区域JVM的主要组成部分及作用JVM运行时数据区域关于HotSpot虚拟机对象问题对象是如何创建的创建对象时内存是如何分配的如何处理并发安全问题对象的内存布局对象的访问方式有哪些内存溢出异常问题 Java内存泄漏和内存溢出是什么,如...

java中::的作用(java中的^什么意思)

本文分享给大家的是: 这里是java8 的新特性的应用forEach是属于java集合的一个方法,准确来说,集合在java8中拥有一个stream方法,可以得到一个流对象,这个对象拥有很多方法,这些方法可以很方便的对集合进行例如排序,分组,计数,遍历,转换等操作,而遍历是比较常见的...

java培训班教什么(找培训机构学java要学多久)

今天给各位分享 在互联网飞速发展的现在,什么岗位最最赚钱?十个人有八个人得说:技术(程序员)。没错!各种互联网企业的快速崛起,让程序员们越来越吃香。下图是在某网站搜索关于技术岗位的需求,和技术人员的薪资范围。 一个初级的Java工程师,薪资都是从8K起,更别说技术大牛CTO...

2021.3.13黄金价格(2021.3.14黄金价格)

今天给各位分享 今天是2月23日,金店黄金价格跌了,但跌的并不多,只为1-2元/克,现在的金价依旧非常高目前,金价最高的金店为老凤祥,不涨不跌,报价539元/克而金价最低的金店也还是中国黄金,报价488元/克今日黄金价格高低差为51元/克 ,价差很高。具体各大品牌金店最新价...

天猫代入驻什么意思(代办天猫入驻费用)

本文分享给大家的是: 不少网友想入驻天猫开店,2020天猫怎么入驻?我为大家介绍最新流程及费用,感兴趣的亲不要错过本文啦。接下来一起看看吧! 一,需要哪些资料:经营不同品牌、不同品类所需要提交的材料有所不同商家可以根据实际经营情况在天猫入驻小帮手中选择输入您要经营的店铺类型...