CMakeLists.txt命令解析

作为一个计算机小白,最近准备写一个大工程,在Linux下写,配置CMakeLists的时候好多的坑,在这里把CMakeLists的常用命令都罗列一下,整理一下大脑。这个主要是整理给我自己看的,大家看到这个的时候可能还有很多不清楚,关于CMakeLists的详细教程可以参考《CMake实践》,我会分享给大家。

CMAKE_MINIMUM_REQUIRED( VERSION X.X )

PROJECT(<PROJECT NAME>)

FIND_PACKAGE(<PACKAGE NAME> REQUIRED)

ADD_EXECUTABLE(<EXECUTABLE NAME> <EXECUTABLE NAME>.<type>)

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] source1 source2 ... sourceN)

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)#引入头文件搜索路径
#INCLUDE_DIRECTORIES(/usr/include/hello)

TARGET_LINK_LIBRARIES(target library1
<debug | optimized> library2
...)
#用来链接共享库
#TARGET_LINK_LIBRARIES(main hello)#libhello.so
#TARGET_LINK_LIBRARIES(main libhello.a)#链接动态库


SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
#SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

GET_TARGET_PROPERTY(VAR target property)
#GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)
#MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:”${OUTPUT_VALUE})

#SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

MESSAGE(SEND_ERROR | STATUS | FATAL_ERROR "<MESSAGE>")

SET(<VALUEABLE NAME> <VALUE>)#用来设置变量,可以是字符串什么的

ADD_SUBDIRECTORY(<源代码目录> <目标文件、可执行文件目录> [EXCLUDE_FROM_ALL])
#EXCLUDE_FROM_ALL暂时不考虑是什么东西,用不上
#可以用来添加子目录到工程中,子目录要有CMakeLists
#SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)可以利用设置这个变量并应用
#到ADD_SUBDIRECTORY命令中然后改变目标文件和二进制文件的储存目录

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)#DESTINATION 定义了安装的路径,如果路径以/开头,那么指的是绝对路径,这时候
CMAKE_INSTALL_PREFIX 其实就无效了。如果你希望使用 CMAKE_INSTALL_PREFIX 来
定义安装路径,就要写成相对路径,即不要以/开头,那么安装后的路径就是
${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>
可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

#INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)#静态库要用ARCHIVE

INSTALL(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])#普通文件的安装,包括头文件
#INSTALL(FILES hello.h DESTINATION include/hello)



INSTALL(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])#脚本之类的安装

INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])#目录的安装

ADD_DEPENDENCIES
定义 target 依赖的其他 target,确保在编译本 target 之前,其他的 target 已经被构
建。
ADD_DEPENDENCIES(target-name depend-target1
depend-target2 ...)


引用set的变量方式:${变量名}

CMakeLists变量:

PROJECT_SOURCE_DIR:工程目录

PROJECT_BINARY_DIR:编译目录

CMAKE_INSTALL_PREFIX:一般为usr/local,在cmake -DCMAKE_INSTALL_PREFIX=<路径> ..


CMAKE_INCLUDE_PATH(是环境变量)

CMAKE_LIBRARY_PATH(是环境变量)

当头文件库文件不在usr/local下的时候,可以用到这两个环境变量,两个环境变量用法如下

FIND_PATH(myHeader hello.h)
IF(myHeader)

INCLUDE_DIRECTORIES(${myHeader})

ENDIF(myHeader)

#这里我们没有指定路径,但是,cmake 仍然可以帮我们找到 hello.h 存放的路径,就是因为我们设置了环境变量 CMAKE_INCLUDE_PATH。

#FIND_PATH(myHeader NAMES hello.h PATHS /usr/include /usr/include/hello)

CMAKE_LIBRARY_PATH 可以用在 FIND_LIBRARY 中。

CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录。

CMAKE_CURRRENT_BINARY_DIR:如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-

source 编译,他指的是 target 编译目录。

CMAKE_CURRENT_LIST_FILE:输出调用这个变量的 CMakeLists.txt 的完整路径

CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行

EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量

使用$ENV{NAME}指令就可以调用系统的环境变量了。

CMAKE_CXX_FLAGS:设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。



注意:

1、目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc,如果目录名以/结尾,

代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。

2、安装一般文件,并可以指定访问权限,文件名是此指令所在路径下的相对路径。如果默认不定义权限 PERMISSIONS,安装后的权限为:OWNER_WRITE, OWNER_READ,GROUP_READ,和 WORLD_READ,即 644 权限。

3、非目标文件的可执行程序安装(比如脚本之类)默认安装后权限为:OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE,即 755 权限

4、CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件搜索路径放在已有路径的前面

5

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值