开源项目学习(2) ---- CMake 使用方法

  1. CMake 简介

CMake is a tool to manage building of source_code, Originally,CMake was designed as a generator for various dialects of Makefiles. today CMake generates modern build systems such as ninjia as well as project files for IDES such as VisualStudio ans X code.

CMake is widely used for the C and C++ languages,but it may be used to build source code of other languages too.

CMake 是一个跨平台的安装编译工具,可以用简单的语法描述所有平台的安装编译过程,他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性,类似于UNIX 下的 automake

CMake 各个组件功能如下:

CTest 提供了一个测试框架用于编写单元测试程序

CPack 提供了一系列打包方法,将输出内容打包成 zip,tgz 等文件

2. CMake 使用方法

CMake 的所有语句都写在一个名为 CMakeLists.txt 的文件中,当 CMakeLists.txt 文件确定以后,就可以用cmake 命令对相关的变量值进行配置,这个命令必须指向 CMakeLists.txt 所在的目录。配置完成之后,应用 cmake 命令生成相应的 makefile (在 Unix like 系统下),或者Visual studio 的project 文件(指定用 windows 下的相应的编程工具编译时)。

基本操作流程:

ccmake directory(Unix like system) 或者 cmake-gui (windows)

cmake directory

make

其中的 directory 是 CMakeLists.txt 所在的目录:

  • 第一句语句用于配置编译选项,一般这一步不需要配置,直接执行第二条语句即可,但是出现错误时,这里就需要人为的配置了
  • 第二句语句根据 CMakeLists.txt 生成相应的 makefile 或者 项目工程文件
  • 第三条语句用于执行Makefile,编译程序,生成可执行文件

3. CMake 基本语法

CMake 支持大写,小写和大小写混合命令,基本命令大小写都是支持的

使用 # 作为CMake 的注释方法

变量:使用 set 命令显式定义以及赋值,在非if 语句中,使用 ${} 引用(一般情况下使用 ${}),但是在 if 中可以直接使用变量名引用,后续的 set 命令会清理掉变量原来的值

条件语句的基本形式:

if(expr)

endif

if()

elseif()

endif

循环语句:

WHILE()

ENDWHILE()

4. CMake 内置变量

CMAKE_C_COMPILER:指定 C 编译器

CMAKE_CXX_COMPILER:指定 CXX 文件编译器

CMAKE_C_FLAGS:编译C时的选项,比如 -g 也可以通过 add_definition 添加

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

LIBRARY_OUTPUT_PATH:库文件的路径

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

内置变量的使用:

在 CMakeLists.txt 中使用,指定的方法是 set

在 CMake 命令行中使用,比如 cmake -DBUILD_SHARED_LIBS=OFF

CMAKE_SOURCE_DIR:顶级CMakeLists.txt 的文件路径

CMAKE_BINRAY_DIR:对应CMake 的build 目录,主要是运行时生成的文件目录

CMAKE_CURRENT_SOURCE_DIR:一般来说,工程中会有一个 CMakeLists.txt 文件,这个对应的是当前目录

CMAKE_MODULE_PATH:api(include/find_package)包含别的cmake文件时的搜索目录

CMAKE_PREFIX_PATH: api(find_libray/path) 包含其他模块时的搜索目录。

CMAKE_INSTALL_PREFIX:调用 install  函数,要生成保存根目录路径

5.CMake 常用命令

指定CMake 最小版本号

cmake_minimum_required(VERSION 3.00)

cmake_minimum_required(VERSION 版本号)

定义工程名称

project (HELLO)   #指定项目名称,生成的 Visual C++ 的项目名称

#使用${HELLO_SOURCE_DIR}表示项目根目录、

定义显示变量

set(var [value])

第一种方法,生成代码文件列表

先直接设置 SRC_LIST 的值

set(SRC_LIST add.h add.cpp)

然后再 SRC_LIST 中追加 main.cpp

set(SRC_LIST main.cpp)

第二种用法:设置库文件生成目录或者可执行文件目录

set(LIBRARY_OUTPUT_PATH  ./)

编译静态库

add_library(库的名称 STATIC 代码文件名称)

示例:

add_library(add STATIC add.h add.cpp)

add_library(add STATIC $(ADD_SRC) ${ADD_HDR})

编译动态库

add_library(库的名称 SHARED 代码文件名称)

add_library(add SHARED add.h add.cpp)

add_library(add SHARED $(ADD_SRC) ${ADD_HDR})

编译可执行程序

add_excutable(可执行程序名 代码文件名称)

add_executable(main add.h add.cpp main.cpp)

add_executable(main ${MAIN_SRC} ${MAIN_HDR})

指定静态库或者动态库的输出目录

set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/lib)

指定可执行文件的输出目录

set(EXECUTABLE_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/bin)

设置链接库的搜索目录

link_directories( ${PROJECT_SOUCE_DIR}/lib/linux)

设置包含目录

设置包含的头文件目录:

include_directories(${PROJECT_SOUCE_DIR}/include)

设置宏定义(添加编译选项)

add_definition(-DWINDOWS)

add_definition(-DLINUX)

例如:

add_definitions(-DDEBUG)  在GCC 命令行添加DEBUG 宏定义

add_definitions( “-Wall -ansi –pedantic –g”)

链接静态库和动态库

link_libraries ( 静态库1, 静态库2, 静态库3 )

注意 link_libraries 的静态库是全路径,常常和 link_directories 搭配使用

比如:

link_directories( ${PROJECT_SOUCE_DIR}/lib/linux)

link_libraries(lib1.a lib2.a)

链接动态库:

target_link_libraries(需要生成的文件名称    所需链接的动态库名称)

比如:

target_link_libraries(demo Hello) 将可执行文件和 libHello.so 链接生成 demo

link_libraries 和 target_link_libraries 的区别

link_libraries 用在 add_executable 之前,target_link_libraries 用在add_executable 之后

link_libraries 用来链接静态库

target_link_libraries 用来链接动态链接库

添加子文件夹

add_subdirectory:包含的子目录

add_subdirectory (Hello)

该语句会在执行完成当前目录的 CMakeLists.txt 后再指向子目录的 CMakeLists.txt

输出信息

message(FATAL_ERROR “Enter cmake”)

message(WARNING “Enter cmake”)

message(STATUS “Enter cmake”)

常用的COMMAND

list : 针对列表操作,比如对 文件列表/参数列表/编译列表的增加删除这些内容

file:针对文件操作,比如收集文件列表,读写文件等

string:针对字符串的操作,比如大小写,查找,正则表达式匹配等

message: 打印消息,可以跟踪测试修改

6.常用头文件

include(CMakeDependentOption) cmake内置,包含 cmake_dependent_option 方法

include(CheckCXXCompilerFlag) cmake 内置,包含 CHECK_CXX_COMPILER_FLAG 用于检查 C++ 标准的支持情况

6.CMake 使用技巧

1.获取一个目录下的所有文件:

AUX_SOURCE_DIRECTORY(. DIR_SRCS)

将当前路径下的所有文件都保存到变量 DIR_SRCS 中,然后可以 add_excutable(dp_demo_linux $(DIR_SRCS)) 这样使用

2.将 CMake 版本号传递给程序

configure_file(dp_demo_linux.in dp_demo_linux.h)

使用上面的命令,会生成 dp_demo_linux.h,里面包含了主次版本号的宏,可以直接在程序中include 使用 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值