CMake笔记(3)CMake常用命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weicao1990/article/details/81201480

CMake常用命令

1. project

project(projectname [CXX] [C] [Java])

指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言。

project(CMakeDemo)

2.set
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
定义变量(可以定义多个VALUE)

set(SRC_LIST main.c util.c reactor.c)

3. message
message([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
向终端输出用户定义的信息或变量的值。
SEND_ERROR, 产生错误,生成过程被跳过
STATUS, 输出前缀为—的信息
FATAL_ERROR, 立即终止所有cmake过程

message(${SRC_LIST})

4.add_executable

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 [source2 ...])
生成可执行文件

add_executable(bin_file_name ${SRC_LIST})

5. add_library
add_library(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
生成动态库或静态库
SHARED 动态库
STATIC 静态库
MODULE 在使用dyld的系统有效,若不支持dyld,等同于SHARED
EXCLUDE_FROM_ALL 表示该库不会被默认构建


add_library(shared_demo SHARED ${SRC_LIST})

6. set_target_properties

set_target_properties(target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)

设置目标的属性值,例如设置输出库名为 static => libstatic.a

set_target_properties(static_demo PROPERTIES OUTPUT_NAME "static") 

7.cmake_minimum_required
cmake_minimum_required(VERSION version_number [FATAL_ERROR])
声明CMake的版本要求

cmake_minimum_required(VERSION 2.8)

8.add_subdirectory
add_subdirectory(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除

如下:添加子目录,这样进入源码文件src目录可以继续构建

add_subdirectory(${PROJECT_SOURCE_DIR}/src)

9.include_directories
include_directories([AFTER | BEFORE] [SYSTEM] dir1 dir2 … )
相当于gcc -I xxx,向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,如果路径包含空格,可以使用双引号将它括起来,默认的行为为追加到当前头文件搜索路径的后面。有如下两种方式可以控制搜索路径添加的位置:
cmake_include_directories_before,通过SET这个cmake变量为on,可以将添加的头文件搜索路径放在已有路径的前面
通过AFTER或BEFORE参数,也可以控制是追加还是置前。

include_directories(${PROJECT_SOURCE_DIR}/include)

10.link_directories
link_directories(dir1 dir2 …)
相当于gcc -L xxx,添加非标准的共享库搜索路径

link_directories("/opt/MATLAB/R2012a/bin/glnxa64")

11.target_link_libraries
target_link_libraries(target lib1 lib2 …)
为target添加需要链接的库文件的名称

target_link_libraries(main pthread)

12. link_libraries

 link_libraries([item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

添加需要链接的库文件的路径,注意这里是全路径 

link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

13. add_definitions
向C/C++编译器添加-D定义,参数之间用空格分隔

add_definitions (-DENABLE_DEBUG -DABC)

14. add_dependencies 
add_dependencies (target-name depend-target1 depend-target2 …)
定义target依赖的其他target,确保target在构建之前,其依赖的target已经构建完毕

15. aux_source_directory
aux_source_directory (dir VAR)
扫描一个目录下所有的源代码文件并将列表存储在一个变量中

aux_source_directory(. DIR_LIB_SRCS)

16. include
include(file [OPTIONAL]) 用来载入CMakeLists.txt文件
include(module [OPTIONAL])用来载入预定义的cmake模块
OPTIONAL参数的左右是文件不存在也不会产生错误
可以载入一个文件,也可以载入预定义模块(模块会在CMAKE_MODULE_PATH指定的路径进行搜索)
载入的内容将在处理到include语句时直接执行

17. find_file

find_file(<VAR> name path1 path2 …)
VAR变量代表找到的文件全路径,包含文件名

18. find_libaray
find_libaray(<VAR> name path1 path2 …)
VAR变量代表找到的库全路径,包含库文件名

FIND_LIBRARY(libX X11 /usr/lib)
IF (NOT libx)
    MESSAGE(FATAL_ERROR "libX not found")
ENDIF(NOT libX)

19.find_path(<VAR> name path1 path2 …)
VAR变量代表包含这个文件的路径

19. find_program(<VAR> name path1 path2 …)
VAR变量代表包含这个程序的全路径

20.find_package(<name> [major.minor] [QUIET] [NO_MODULE] [[REQUIRED | COMPONENTS] [componets …]])
用来调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块,你也可以自己定义Find<name>
模块,通过SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录供工程使用

21.exec_program
exec_program(Executable [dir where to run] [ARGS <args>][OUTPUT_VARIABLE <var>] [RETURN_VALUE <value>])
用于在指定目录运行某个程序(默认为当前CMakeLists.txt所在目录),通过ARGS添加参数,通过OUTPUT_VARIABLE和RETURN_VALUE获取输出和返回值,如下示例

# 在src中运行ls命令,在src/CMakeLists.txt添加
exec_program(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
IF (not LS_RVALUE)
    MESSAGE(STATUS "ls result: " ${LS_OUTPUT}) # 缩进仅为美观,语法无要求
ENDIF(not LS_RVALUE)

一个简单的CMake工程示例:

https://blog.csdn.net/weicao1990/article/details/72844995

展开阅读全文

没有更多推荐了,返回首页