cmakelists链接库_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()

如果找到这个包,则可以通过在工程的顶层目录中的CMakeLists.txt 文件添加 include_directories(_INCLUDE_DIRS) 来包含库的头文件,添加target_link_libraries(源文件 _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([version][EXACT][QUIET][NO_MODULE] [[REQUIRED|COMPONENTS][componet...])

PROJECT_NAME 返回通过PROJECT指令定义的项目名称

参考:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值