您的位置:首页 > 其它

cmake实用指南(一):基础命令的使用

2017-08-07 11:26 405 查看
参考网址:https://my.oschina.net/u/1046919/blog/477645
           http://www.cnblogs.com/lidabo/p/3974305.html

  
基本结构

1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;

2,在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录

3,子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)

内部变量
CMAKE_C_COMPILER:指定C编译器

CMAKE_CXX_COMPILER:

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release,)CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

内置变量的使用:
>> 在CMakeLists.txt中指定,使用set
>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF
常用命令:
cmake dir_path,生成工程文件或makefile文件
示例:mkdir build 
           cd build
           cmake .. 
    make
作用:生成build文件夹,并生成makefile文件

===========================================================

project (HELLO)   #指定项目名称,生成的VC项目的名称;
使用${HELLO_SOURCE_DIR}表示项目根目录

===========================================================

message 命令
语句 : message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)
作用 : 输出信息
示例 : message("hello world")

===========================================================

file 命令
语句 : file(WRITE filename "message to write"... ) 
作用 : WRITE选项将会写一条消息到名为filename的文件中。如果文件已经存在,该命令会覆盖已有的文件;如果文件不存在,它将创建该文件。

语句 : file(APPEND filename "message to write"... )
作用 : APPEND选项和WRITE选项一样,将会写一条消息到名为filename的文件中,只是该消息会附加到文件末尾。 

语句 : file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX]) 
作用 : READ选项将会读一个文件中的内容并将其存储在变量里。读文件的位置从offset开始,最多读numBytes个字节。
如果指定了HEX参数,二进制代码将会转换为十六进制表达方式,并存储在变量里。 

语句 : file(STRINGS filename variable [LIMIT_COUNT num] [LIMIT_INPUT numBytes]  [LIMIT_OUTPUT numBytes] 
  [LENGTH_MINIMUM numBytes]   [LENGTH_MAXIMUM numBytes]
[NEWLINE_CONSUME] [REGEX regex]  [NO_HEX_CONVERSION]) 

作用 : STRINGS将会从一个文件中将一个ASCII字符串的list解析出来,然后存储在variable变量中。文件中的二进制数据会被忽略。

回车换行符会被忽略。它也可以用在Intel的Hex和Motorola的S-记录文件;读取它们时,它们会被自动转换为二进制格式。

可以使用NO_HEX_CONVERSION选项禁止这项功能。LIMIT_COUNT选项设定了返回的字符串的最大数量。LIMIT_INPUT设置了从输入文件中读取的最大字节数。

LIMIT_OUTPUT设置了在输出变量中存储的最大字节数。LENGTH_MINIMUM设置了要返回的字符串的最小长度;小于该长度的字符串会被忽略。

LENGTH_MAXIMUM设置了返回字符串的最大长度;更长的字符串会被分割成不长于最大长度的字符串。

NEWLINE_CONSUME选项允许新行被包含到字符串中,而不是终止它们。REGEX选项指定了一个待返回的字符串必须满足的正则表达式。 

        语句 : file(GLOB variable [RELATIVE path] [globbing expressions]...) 
作用 : GLOB选项将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里。文件名查询表达式与正则表达式类似,只不过更加简单。如果为一个表达式指定了RELATIVE标志,返回的结果将会是相对于给定路径的相对路径。 

语句 : file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...) 
作用 : GLOB_RECURSE选项将会生成一个类似于通常的GLOB选项的list,只是它会寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件。
作为符号链接的子路径只有在给定FOLLOW_SYMLINKS选项或者cmake策略CMP0009被设置为NEW时,才会被寻访到。

参见cmake --help-policy CMP0009 查询跟多有用的信息。 

语句 : file(RENAME <oldname> <newname>) 
作用 : RENAME选项对同一个文件系统下的一个文件或目录重命名。

语句 : file(REMOVE [file1 ...]) 
作用 : REMOVE选项将会删除指定的文件,包括在子路径下的文件。

语句 : file(REMOVE_RECURSE [file1 ...]) 
作用 : REMOVE_RECURSE选项会删除给定的文件以及目录,包括非空目录。 

语句 : file(MAKE_DIRECTORY [directory1 directory2 ...]) 
作用 : MAKE_DIRECTORY选项将会创建指定的目录,如果它们的父目录不存在时,同样也会创建。(类似于mkdir命令——译注) 

语句 : file(RELATIVE_PATH variable directory file) 
作用 : RELATIVE_PATH选项会确定从direcroty参数到指定文件的相对路径。 

语句 : file(TO_CMAKE_PATH path result) 
作用 : TO_CMAKE_PATH选项会把path转换为一个以unix的 / 开头的cmake风格的路径。输入可以是一个单一的路径,也可以是一个系统路径,

比如"$ENV{PATH}"。注意,在调用TO_CMAKE_PATH的ENV周围的双引号只能有一个参数(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。 

语句 : file(TO_NATIVE_PATH path result) 
作用 : TO_NATIVE_PATH选项与TO_CMAKE_PATH选项很相似,但是它会把cmake风格的路径转换为本地路径风格:windows下用\,而unix下用/。 

语句 : file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sum] [SHOW_PROGRESS]) 
作用 : DOWNLOAD 将给定的URL下载到指定的文件中。如果指定了LOG var选项,下载日志将会被输出到var中。如果指定了STATUS var选项,

下载操作的状态会被输出到var中。该状态返回值是一个长度为2的list。list的第一个元素是操作的数字返回值,第二个返回值是错误的字符串值。

错误信息如果是数字0,操作中没有发生错误。如果指定了TIMEOUT time选项,在time秒之后,操作会超时退出;time应该是整数。如果指定了EXPECTED_MD5 sum选项,

下载操作会认证下载的文件的实际MD5和是否与期望值匹配。如果不匹配,操作将返回一个错误。如果指定了SHOW_PROGRESS选项,进度信息会以状态信息的形式被打印出来,

直到操作完成。

===========================================================

include_directories 命令

语句 : include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
作用 : 用于设定目录,这些设定的目录将被编译器用来查找 include 文件
示例 : include_directories(${PROJECT_SOURCE_DIR}/lib)

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
include_directories (${HELLO_SOURCE_DIR}/Hello)  #增加Hello为include目录

===========================================================

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

===========================================================

add_executable 命令

语句 : add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
作用 : 将指定文件source编译成可执行文件,命名位name
示例 : add_executable(hello hello.cpp)

===========================================================

target_link_libraries 命令

语句 : target_link_libraries(<target> [item1 [item2 […]]] [[debug|optimized|general] ] …)
作用 : 用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)
示例 : target_link_libraries(Main Lib)

 TARGET_LINK_LIBRARIES(app.fcgi
 common.a
 mongoclient.a
 boost_system.a
 boost_thread.a
 boost_filesystem.a
 boost_program_options.a
 jsoncpp.a
 pthread
 rt 
 z
 libfcgi.a
 sybdb
 rt
 )

target_link_libraries:添加链接库,相同于指定-l参数
target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

===========================================================

add_subdirectory 命令
语句 : add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
作用 : 用于添加一个需要进行构建的子目录
示例 : add_subdirectory(directory)

add_subdirectory:包含子目录
add_subdirectory (Hello)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: