1 / 11
文档名称:

在 linux 下使用 CMake 构建应用程序.pdf

格式:pdf   大小:1,429KB   页数:11页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

在 linux 下使用 CMake 构建应用程序.pdf

上传人:1781111**** 2024/5/11 文件大小:1.40 MB

下载得到文件列表

在 linux 下使用 CMake 构建应用程序.pdf

相关文档

文档介绍

文档介绍:该【在 linux 下使用 CMake 构建应用程序 】是由【1781111****】上传分享,文档一共【11】页,该文档可以免费在线阅读,需要了解更多关于【在 linux 下使用 CMake 构建应用程序 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..在linux下使用CMake构建应用程序王程明(@),硕士研究生,吉林大学计算机科学与技术学院本文介绍了一个跨平台的自动化构建系统CMake在linux上的使用方法。CMake是一个比automake更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来。文中通过一些例子介绍使用CMake处理多源文件目录的方法、查找并使用其他开发包的方法以及生成debug版和release版程序的方法。1CMake简介CMake是一个跨平台的自动化建构系统,,可以产生标准的构建文件,如Unix的Makefile或WindowsVisualC++的projects/workspaces。,也可以通过编写脚本进行半自动的生成。CMake提供了比autoconfig更简洁的语法。在linux平台下使用CMake生成Makefile并编译的流程如下:?。?执行命令“cmakePATH”makePATH”生成Makefile()。?使用make命令进行编译。#include<iostream>intmain(){:..return0;}为了构建该项目,:(main)CMAKE_MINIMUM_REQUIRED()AUX_SOURCE_DIRECTORY(.DIR_SRCS)ADD_EXECUTABLE(main${DIR_SRCS}),由命令、注释和空格组成,其中命令是不区分大小写的,符号后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。:第一行是一条命令,名称是PROJECT,参数是main,该命令表示项目的名称是main。第二行的命令限定了CMake的版本。第三行使用命令AUX_SOURCE_DIRECTORY将当前目录中的源文件名称赋值给变量DIR_SRCS。CMake手册中对命令AUX_SOURCE_DIRECTORY的描述如下:aux_source_directory(<dir><variable>)该命令会把参数<dir>中所有的源文件名称赋值给参数<variable>。第四行使用命令ADD_EXECUTABLE指示变量DIR_SRCS中的源文件需要编译成一个名称为main的可执行文件。。make提供了一个图形化的操作界面。cmake命令的执行方式如下:cmake[options]<path-to-source>“cmake.”后就可以得到Makefile并使用make进行编译,如下图所示。:..3处理多源文件目录的方法CMake处理源代码分布在不同目录中的情况也十分简单。现假设我们的源代码分布情况如下:。?第一步,。文件内容如下:(main)CMAKE_MINIMUM_REQUIRED():..ADD_SUBDIRECTORY(src)AUX_SOURCE_DIRECTORY(.DIR_SRCS)ADD_EXECUTABLE(main${DIR_SRCS})TARGET_LINK_LIBRARIES(mainTest)相对于清单2,该文件添加了下面的内容:第三行,使用命令ADD_SUBDIRECTORY指明本项目包含一个子目录src。第六行,使用命令TARGET_LINK_LIBRARIES指明可执行文件main需要连接一个名为Test的链接库。?第二步,。文件内容如下:(.DIR_TEST1_SRCS)ADD_LIBRARY(Test${DIR_TEST1_SRCS})在该文件中使用命令ADD_LIBRARY将src目录中的源文件编译为共享库。?第三步,,进入目录step2中依次执行命令“cmake.”和“make”得到结果如下:,,当程序执行命令ADD_SUBDIRECTORY(src)。:..4在工程中查找并使用其他程序库的方法在开发软件的时候我们会用到一些函数库,这些函数库在不同的系统中安装的位置可能不同,编译的时候需要首先找到这些软件包的头文件以及链接库所在的目录以便生成编译选项。例如一个需要使用博克利数据库项目,,,放在项目的根目录中。?第一步,程序库说明文件在项目的根目录中创建目录cmake/modules/,在cmake/modules/,内容如下:(STAFIND_PATH(//usr/local/include/)FIND_LIBRARY(LIBDB_CXX_LIBRARIESNAMESdb_cxxPATHS/usr/lib//usr/local/lib/):,其中NAME是函数库的名称。。这里使用了三个命令:MESSAGE,FIND_PATH和FIND_LIBRARY。?命令MESSAGE会将参数的内容输出到终端。?命令FIND_PATH指明头文件查找的路径,原型如下:find_path(<VAR>name1[path1path2...])该命令在参数path*指示的目录中查找文件name1并将查找到的路径保存在变量VAR中。清单5第3-8行的意思是在:../usr/include/和/usr/local/include/,。?命令FIND_LIBRARY同FIND_PATH类似,用于查找链接库并将结果保存在变量中。清单5第10-13行的意思是在目录/usr/lib/和/usr/local/lib/中寻找名称为db_cxx的链接库,并将结果保存在LIBDB_CXX_LIBRARIES。?第二步,:(main)CMAKE_MINIMUM_REQUIRED()SET(CMAKE_SOURCE_DIR.)SET(CMAKE_MODULE_PATH${CMAKE_ROOT}/Modules${CMAKE_SOURCE_DIR}/cmake/modules)AUX_SOURCE_DIRECTORY(.DIR_SRCS)ADD_EXECUTABLE(main${DIR_SRCS})FIND_PACKAGE(libdb_cxxREQUIRED)MARK_AS_ADVANCED(LIBDB_CXX_INCLUDE_DIRLIBDB_CXX_LIBRARIES)IF(LIBDB_CXX_INCLUDE_DIRANDLIBDB_CXX_LIBRARIES)MESSAGE(STAINCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})MESSAGE(${LIBDB_CXX_LIBRARIES})TARGET_LINK_LIBRARIES(main${LIBDB_CXX_LIBRARIES})ENDIF(LIBDB_CXX_INCLUDE_DIRANDLIBDB_CXX_LIBRARIES)在该文件中第4行表示到目录./cmake/,8-19行表示查找链接库和头文件的过程。第8行使用命令FIND_PACKAGE进行查找,。第13-19行是条件判断语句,表示如果LIBDB_CXX_INCLUDE_DIR和LIBDB_CXX_LIBRARIES都已经被赋值,则设置编译时到LIBDB_CXX_INCLUDE_DIR寻找头文件并且设置可执行文件main需要与链接库LIBDB_CXX_LIBRARIES进行连接。?第三步,:..“cmake.”和“make”可以进行编译,结果如下图所示:,使用CMake我们也可以达到上述效果。debug版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版的不需要调试信息但需要优化。/g++中是通过编译时的参数来决定的,如果将优化程度调到最高需要设置参数-O3,最低是-O0即不做优化;添加调试信息的参数是-g-ggdb,如果不添加这个参数,调试信息就不会被包含在生成的二进制文件中。CMake中有一个变量CMAKE_BUILD_TYPE,可以的取值是DebugReleaseRelWithDebInfo和MinSizeRel。当这个变量值为Debug的时候,CMake会使用变量CMAKE_CXX_FLAGS_DEBUG和CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成Makefile,当这个变量值为Release的时候,工程会使用变量CMAKE_CXX_FLAGS_RELEASE和CMAKE_C_FLAGS_RELEASE选项生成Makefile。,::..清单7PROJECT(main)CMAKE_MINIMUM_REQUIRED()SET(CMAKE_SOURCE_DIR.)AUX_SOURCE_DIRECTORY(.DIR_SRCS)ADD_EXECUTABLE(main${DIR_SRCS})第5和6行设置了两个变量CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS_RELEASE,这两个变量是分别用于debug和release的编译选项。。在进入项目的根目录,输入进入一个图形化界面,如下图所示:make的界面按照界面中的提示进行操作,按进行configure,这时界面中显示出了配置变量CMAKE_BUILD_TYPE的条目。如下图所示::..下面我们首先生成Debug版的Makefile:将变量CMAKE_BUILD_TYPE设置为Debug,按进行configure,按生成Makefile并退出。这时执行命令find*|xargs后结果如下:清单的执行结果CMakeFiles/:CXX_FLAGS=-O0-Wall-g-ggdbCMakeFiles/:/usr/bin/c++-O0-Wall-g-ggdbCMakeFiles/.o-omain-rdynamic这个结果说明生成的Makefile中使用了变量CMAKE_CXX_FLAGS_DEBUG作为编译时的参数。下面我们将生成Release版的Makefile:再次执行命令将变量CMAKE_BUILD_TYPE设置为Release,生成Makefile并退出。执行命令find*|xargsgrep后结果如下::SET(CMAKE_CXX_FLAGS_DEBUG-O0-Wall-g而执行命令后结果如下::..:CMAKE_C_FLAGS_RELEASE:STRING=-O3–DNDEBUGCMakeFiles/:CXX_FLAGS=-O3-WallCMakeFiles/:/usr/bin/c++-O3-WallCMakeFiles/.o-omain-rdynamic这两个结果说明生成的Makefile中使用了变量CMAKE_CXX_FLAGS_RELEASE作为编译时的参数。,通过set语句可以自定义变量,然而,CMake还包含大量的内置变量,这些变量和自定义变量的用法没有区别,下面就列出一些常用的变量:PILER指定C编译器,通常,CMake运行时能够自动检测C语言编译器。进行嵌入式系统开发时,通常需要设置此变量,指定交叉编译器。PILER指定C++编译器CMAKE_C_FLAGS指定编译C文件时编译选项,比如-g指定产生调试信息。也可以通过add_definitions命令添加编译选项。EXECUTABLE_OUTPUT_PATH指定可执行文件存放的路径。,我们还可以通过命令来修改编译选项,现将一些常用的命令列出来::..gcc编译器的-I参数link_directories动态链接库或静态链接库的搜索路径,相当于指>的-L参数add_subdirectory包含子目录,当工程包含多个子目录时,此命令有用add_definitions添加编译参数,比如add_definitions(-DDEBUG)命令行添加DEBUG宏定义add_executable编译可执行程序target_link_libraries指定链接库,相同于指定-l参数