CMakeLists学习笔记

一、CMakeLists使用方法
1、语法
1)#注释
2)变量:使用set命令显式定义及赋值,在非if语句中,使用 ${} 引用,在if中直接使用变量名引用;后续的set命令会清理变量原来的值
3)command(args...) 命令不分大小写,参数使用空格分隔,使用双引号引起参数中的空格
4)set(var a;b;c)<=>set(var a b c)#定义变量var并赋值为a;b;c这样一个string list
5)add_executable(${var}) <=> add_executable(a b c) #变量使用${}引用
6)条件语句
if(var) #var 非empty o N No OFF False... #非运算符使用NOT

...

else/elseif()...endif(var)
7)循环语句
set(var a b c)
foreach(f ${var})   ...endforeach(f)

8)循环语句
while()...endwhile()

2、内部变量
CMAKE_C_COMPILER :制定C编译器
EXECUTABLE_OUTPUT_PATH:可执行文件存放路径
LIBRARY_OUT_PATH: 库文件路径
CMAKE_BUILD_TYPE: build类型(Debug, Release,...)
BUILD_SHARED_LIBS:选择静态.a或者动态链接库.so
内置变量的使用:
>> 在CMakeLists.txt中指定,使用set

>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF
3、命令
project (HELLO)   #指定项目名称,生成的VC项目的名称;
>>使用${HELLO_SOURCE_DIR}表示项目根目录
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_subdirectory:包含子目录
>> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
 >> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions:添加编译参数
>> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
>> add_definitions( “-Wall -ansi –pedantic –g”)

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

add_library:
>> add_library(Hello hello.cxx)  #将hello.cxx编译成静态库如libHello.a

add_custom_target:
message( status|fatal_error, “message”):
set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....
link_libraries( lib1 lib2 ...): All targets link with the same set of libs

MESSAGE("MSG") #类比echo 打印消息
option(var_name "comment" var_value) #给变量var_name赋值为var_value,comment是此变量的注释,和SET 有类似的功效,用于给某变量设置默认值

link_directories(xxx)
#给编译器添加库目录,类似vs ide中添加库的包含目录
add_library(lib_name SHARED or STATIC lib_source_code)
#和add_executable类似,生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表,此指令只有三个参数
target_link_libraries(target_name lib_name ...)
 #给目标添加依赖库,类似与gcc -l lib_name,此指令有两个用处,一个是给可执行target_name 添加库依赖,二是给库target_name 添加库依赖。

install 指令(主要是生成Makefile中的install target)
install(FILES flie DESTINATION dir_path)
#执行make install时,把file拷贝到dir_path
install(PROGRAMS file DESTINATION dir_path)
 #执行make install时,把file拷贝到dir_path,并给予file可执行权限
INSTALL(TARGETS ylib ylib_s
#RUNTIME DESTINATION xxx
 LIBRARY DESTINATION lib
 ARCHIVE DESTINATION lib )
# 安装libylib.so到lib目录,安装libylib_s.a到lib目录,RUNTIME 是安装可执行文件到xxx目录,注意这个指令有个坑,我后面会说明这个问题。

install指令的坑
INSTALL(TARGETS ylib ylib_s
#RUNTIME DESTINATION xxx  
LIBRARY DESTINATION lib
 ARCHIVE DESTINATION lib )
 #对于RUNTIME  和 LIBRARY 两种目标,在安装时候,cmake会默认给你移除掉目标文件中的gcc的Wl,rpath的值,导致某些库找不到的错误。
 以下变量会影响此坑,更详细的信息去查查别的资料,我这里就不详细说明了。
#set(CMAKE_SKIP_BUILD_RPATH FALSE)                
#set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)       
#set(CMAKE_INSTALL_RPATH "")
#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)
#set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
#set(CMAKE_SKIP_RPATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)

二、CMake如何查找链接库——find_package
帽子:
如果编译软件使用了外部库,事先并不知道它的头文件和链接库的位置。得在编译命令中加上包含它们的查找路径。CMake使用 find_package()命令来解决这个问题。
语法:find_package(<Name>)
如果找到这个包,则可以通过在工程的顶层目录中的CMakeLists.txt 文件添加 include_directories(<NAME>_INCLUDE_DIRS) 来包含库的头文件,添加target_link_libraries(源文件 <NAME>_LIBRARIES)命令将源文件与库文件链接起来
栗子:
cmake_minimum_required(VERSION 2.8)
project(helloworld)
add_executable(helloworld hello.c)
find_package(BZip2)
if (BZIP2_FOUND)
include_directories(${BZIP_INCLUDE_DIRS})
target_link_libraries (helloworld ${BZIP2_LIBRARIES})
endif (BZIP2_FOUND)

FIND_PACKAGEFIND_PACKAGE(<name>[version][EXACT][QUIET][NO_MODULE] [[REQUIRED|COMPONENTS][componet...])
PROJECT_NAME 返回通过PROJECT指令定义的项目名称

参考:

简书网学习笔记: https://www.jianshu.com/p/c417e4ab8b30

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值