cmake使用方法(详细)_第1页
cmake使用方法(详细)_第2页
cmake使用方法(详细)_第3页
cmake使用方法(详细)_第4页
cmake使用方法(详细)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、cmake使法(详细)帮助档cmake官新tutorialcmake 添加头件录,链接动态、静态库官档cmake 语法cmake中的link_directories, LINK_LIBRARIES, target_link_libraries的区别技巧cmake命令是不区分写的,但是变量区分。判断编译器类型if ($CMAKE_CXX_COMPILER_ID MATCHES Clang) MESSAGE(Clang)elseif ($CMAKE_CXX_COMPILER_ID STREQUAL GNU) MESSAGE(GNU)elseif ($CMAKE_CXX_COMPILER_ID ST

2、REQUAL Intel) MESSAGE(Intel)elseif ($CMAKE_CXX_COMPILER_ID STREQUAL MSVC) MESSAGE(MSVC)endif()命令选项- D-D 相当于就是定义, -D 可以理解为告诉cmake 后边我要定义些参数了, 你每定义个就在前边加上-D就是了CMAKE_BUILD_TYPE 这种东西往往是在CMakeList.txt 中定义的, 这个是你要编译的类型, 般的选择有debug,release, 但是不确定cmake -DCMAKE_BUILD_TYPE=DebugCMAKE_INSTALL_PREFIX 这个是安装路径. 例

3、编译选项在 cmake 脚本中,设置编译选项可以通过 add_compile_options 命令,也可以通过 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。使这两种式在有的情况下效果是样的,但请注意它们还是有区别的: add_compile_options 命令添加的编译选项是针对所有编译器的(包括c和c+编译器),set命令设置 CMAKE_C_FLAGS 或 CMAKE_CXX_FLAGS 变量则是分别只针对c和c+编译器的。例#判断编译器类型,如果是gcc编译器,则在编译选项中加c+11持if(CMAKE_COMPILER_IS_GNUCXX)se

4、t(CMAKE_CXX_FLAGS -std=c+11 $CMAKE_CXX_FLAGS)message(STATUS optional:-std=c+11) endif(CMAKE_COMPILER_IS_GNUCXX)指定编译器set(CMAKE_C_COMPILER /usr/local/gcc) set(CMAKE_CXX_COMPILER /usr/local/g+)也可以直接在编译的时候指定:cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=/tools/bin/cc -DCMAKE_CXX_COMPILER=/t

5、ools/bin/c+add_compile_options语法add_compile_options( .)# 例add_compile_options(-Wall -Wextra -pedantic -Werror -g)add_compile_definition待补充option & add_definition语法# Provides an option for the user to select as ON or OFF. If no initial is provided, OFF is used. If is already set as a normal variable

6、then the comm option( value)# Add -D define flags to the compilation of source files. add_definitions(-DFOO -DBAR .)使法先在CMakeList.txt中增加选项option(TEST_DEBUG option for debug OFF)if (TEST_DEBUG) # 这步是cmake接收到这个参数了add_definitions(-DTEST_DEBUG) # 这步意思是make编译的时候加上TEST_DEBUG这个定义endif()在cmake构造makefile的时候输

7、想要的参数cmake -DTEST_DEBUG=ON .源码中使该定义/ test.cpp #include test.h#ifdef TEST_DEBUG.#endif语法说明列表和字符串在CMake中基础的数据形式是字符串。CMake也持字符串列表。列表通过分号分隔。譬如两个声明给变量VAR设同样的值:set(VAR a;b;c) set(VAR a b c)字符串列表可以通过foreach命令迭代或直接操控列表命令。变量CMake 持简单的变量可以是字符串也可以是字符串列表。变量参考使 $VAR 语法。多参数可以使 set 命令组合到个列表中。所有其他的命令通过空分隔符传递命令来扩展列表

8、,例如set(Foo a b c)# 将 变量 Foo 设为 a b c, 并且如果Foo 传递给另个命令command($Foo) # 等同于command(a b c)# 如果要把参数列表传递给个命令,且它是个简单的参数只要加个双引号就可以。例如command($Foo) # 等价于command(a b c)控制流像多数语样,Cmake 提供了控制流结构。Cmake提供了三中控制流:条件控制流 if# some_command will be called if the variables value is not: # empty, 0, N, NO, OFF, FALSE, NOTF

9、OUND, or -NOTFOUND.if(var) some_command(.) endif(var)循环结构: foreach 和 whileset(VAR a b c)# loop over a, b,c with the variable f foreach(f $VAR)message($f) endforeach(f)过程定义 宏和函数(函数在2.6及更的版本中有效)。函数对变量局部有效,宏是全局有效。# define a macro hello macro(hello MESSAGE)message($MESSAGE) endmacro(hello)# call the mac

10、ro with the string hello world hello(hello world)# define a function hello function(hello MESSAGE)message($MESSAGE) endfunction(hello)更多控制流信息参见命令 if,while,foreach,macro,function档。引号,字符串和转义在CMake中原义字符串双引号括起来。字符串可以是多字符串,并在其中嵌新的。例如set(MY_STRING this is a string with a newline init)也可以在个字符串中转义字符和使变量set(

11、VAR hello world)message($VAR= $VAR) # prints out$VAR=hello world同样持标准C中的转义message(nthello world) #prints outhello world如果字符在引号之前是空格则原义字符串只是原义字符串。但是引号必须成对,例如message(hello) - prints hello message(hello) - prints helloo正则表达式cmake可以使正则表达式常命令cmake_minimum_requiredcmake project 头件必须存在这命令, 例如 cmake_minimum

12、_required(VERSION 3.10)project设置项名称 project(Tutorial)set语法# Set Normal Variableset( . PARENT_SCOPE)# Set Environment Variable# 这个环境变量只对当前cmake程有效,对外界是效的。set(ENV )例set(CMAKE_CXX_FLAGS $CMAKE_CXX_FLAGS -std=c+11 -O3 -Wall -Wl,-rpath=/tools/lib64 -Wl,-dynamic-linker=/tools/lib/ld-2.17.so)message语法messa

13、ge( message to display .)mode关键字The optional keyword determines the type of message:mo deexplainationFATA L_ER RORCMake Error, stop processing and generation.SEN D_ER RORCMake Error, continue processing, but skip generation.WAR NINGCMake Warning, continue processing.AUT HOR_ WAR NINGCMake Warning (d

14、ev), continue processing.DEP RECA TIONCMake Deprecation Error or Warning if variable CMAKE_ERROR_DEPRECATED or CMAKE_WARN_DEPRECATED isenabled, respectively, else no message.(none) orNOTI CEImportant message printed to stderr to attract users attention. STAT US般就这个,Ideally these should be concise, n

15、o more than a single line, but still informative. VER BOS EDetailed informational messages intended for project users. These messages should provide additional details that wont be of interest in most cases, but which may be useful to those building the projectwhen they want deeper insight into what

16、s happening.eFine-grained messages with very low-level implementation details. Messages using this log level would normally only be temporary and would expect to be removed before releasing the project, packaging upthe files, etc.UdGDetailed informational messages intended for developers working on

17、the project itself as opposed to users who just want to build it. These messages will not typically be of interest to other uesxeprslabinuailtdiionngthe project and will often be closely related to internal implementation details.DmEoBCETRAaux_source_directory 查找源件# 找到所有dir录下的源件(不会递归遍历件夹),源件是.c件(也就是

18、makefile中可以成.o的件)aux_source_directory( )add_library将指定的源件(CPP件)成链接件,然后添加到程中去。语法add_library( STATIC | SHARED | MODULE EXCLUDE_FROM_ALLsource1 source2 .)其中 表库件的名字,该库件会根据命令列出的源件来创建。 STATIC 、 SHARED 和 MODULE 的作是指定成的库件的类型。 STATIC 库是标件的归档件,在链接其它标的时候使。 SHARED 库会被动态链接(动态链接库),在运时会被加载。 MODULE 库是种不会被链接到其它标中的插件

19、,但是可能会在运时使dlopen-系列的函数。add_library(roland_pb CreateUDiskRequest.pb.cc) add_executable(echo_client echo_client.cc)target_link_libraries(echo_client uevent event uevent_base pthread roland_pb protobuf)默认状态下,库件将会在于源件录树的构建录树的位置被创建(默认static),该命令也会在这被调。例add_subdirectory在件夹添加了 library 或者 executable 之后,在上层录

20、添加 subdirectory , 也可以在同个CMakeList.txt中使include_directories 添加头件录它相当于 g+ 选项中的 -I 参数的作,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作。语法:include_directories(AFTER|BEFORE SYSTEM dir1 dir2 .) # 例include_directories(./././thirdparty/comm/include)link_directories 添加需要链接的库件录它相当于 g+ 命令的 -L 选项的作,也相当于环境变量中增加 LD_LIBRARY

21、_PATH 的路径的作。语法:link_directories(directory1 directory2 .) # 例link_directories(/home/server/third/lib)find_library 查找库所在录语法:# A short-hand signature is:find_library ( name1 path1 path2 .)# The general signature is:find_library (name | NAMES name1 name2 . NAMES_PER_DIR HINTS path1 path2 . ENV varPATHS

22、path1 path2 . ENV var PATH_SUFFIXES suffix1 suffix2 . DOC cache documentation string NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH CMAKE_FIND_ROOT_PATH_BOTH | ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH)# 例如下FIND_LIBRARY(RUNTIME_LIB r

23、t /usr/lib /usr/local/lib NO_DEFAULT_PATH)cmake会在录中查找,如果所有录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATHlink_libraries 添加需要链接的库件路径该指令的作主要是指定要链接的库件的路径,该指令有时候不定需要。因为find_package和find_library指令可以得到库件的绝对路径。不过你写的动态库件放在新建的录下时,可以该指令指定该录的路径以便程能够找到。语法: link_libraries(library1 library2 .)# 直接是全路径link_libraries(“/home/server/third/lib/libcommon.a”)# 下的例,只有库名,cmake会动去所包含的录搜索link_libraries(iconv)# 传变量link_libraries($RUNTIME_LIB) # 也可以链接多个link_libraries(/opt/MATLAB/R2012a/bin/glnxa6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论