【cmake-简单实例,快速上手】

1.为什么要使用cmake

1.cmake可以跨平台对项目进行管理,如需增加/减少源文件,对于不同的平台,只需要修改CMakeLists.txt文件内容即可。

2.cmake 使用说明

1.变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名。
2.指令是大小写无关的,参数和变量是大小写相关的。但,推荐全部使用大写指令。

3.cmake重要指令

1.cmake_minimum_required指定Cmake的最小版本要求
语法:cmake_minimum_required(VERSION version number[FATAL_ERROR]
代码实例

#当前cmake的最低版本要求 3.10
cmake_minimum_required (VERSION 3.10)

2.project 定义工程名称,并指定工程支持的语言
语法:project(projectname option)
代码实例

set (TOP_PROJECT_NAME "mytest") # 定义了变量TOP_PROJECT_NAME为"mytest"
project (${TOP_PROJECT_NAME}) //指定工程名称为变量

project ("lv_demo_hub") 
project (HELLOWORLD)
project (mytest LANGUAGES “CPP”) //检查编译器是否存在
project (mytest VERSION 1.1)  //指定工程版本号
project (mytest DESCRIPTION “This is mytest project.) //添加对工程的描述
project (mytest HOMEPAGE_URL “https://www.XXX(示例).com”) //指定工程的URL
project (mytest “CXX”) // 指定语言为c++ ,跟在工程名称后可以省略关键字LANGUAGES
project (mytest VERSION 1.2 LANGUAGES “CXX”) //跟在版本号后,必须带关键字

细节注意:

  • project不是必要的,未使用project命令,cmake仍然会生成一个默认的工程名“Project”,以及工程名对应的变量(例如PROJECT_NAME、CMAKE_PROJECT_NAME、PROJECT_SOURCE_DIR、<PROJECT_NAME>_SOURCE_DIR、PROJECT_BINARY_DIR、<PROJECT_NAME>_BINARY_DIR等,LANGUAGES,不指定,默认语言为C和CXX。
  • project 命令必须在cmake_minimum_required 之后
  • .多次使用project命令 那么CMAKE_PROJECT_NAME、CMAKE_PROJECT_VERSION、CMAKE_PROJECT_DESCRIPTION、CMAKE_PROJECT_HOMEPAGE_URL等变量是以最近一次调用的project为准。

3.set 显式定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

代码实例

#定义SRC变量
set(SRC hello.cpp main.cpp) //SRC标量指向一个列表,列表里包含指定所有文件

4. include_directories 向工程添加多个特定的头文件搜索路径,相当于指定g++编译器的-l参数
语法:include_directories(AFTER [BEFORE] [SYSTEM] dir1 dir2 …)

代码实例:

include_directories(/usr/include/myincludefolder ./include)

5.link_directories 向工程内添加多个特定的库文件搜索路径,相当于指定g++编译器的-L参数
语法:link_directories(dir1 dir2)

代码实例:

#将/usr/lib/mylibfolder和./lib添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib);

6.add_library 生成库文件
语法:add_library(libname [SHARED|STATIC|MUDULE] [EXCLUDE_FROM_ALL] source1 source2 …)
代码示例:

通过变量SRC生成libhello.so,libhello.a等库
add_library(hello SHARED ${SRC})
add_library(hello STATIC${SRC})
add_library(hello MUDULE${SRC})

7.add_compile_options 添加编译参数
语法:add_compile_optins( …)
代码示例

add_compile_optins(-Wall -std=c++11 -o2)

8.add_executable生成可执行文件
语法:add_executable(exename source1 source2 …)
代码实例

add_executable(main main.cpp);  //将main.cpp生成可执行文件main

9.target_link_libraries 为target添加需要链接的共享库,相当于指定g++编译器-l 参数
语法:target_link_libraries(target library1<debug | optimized>library2)
代码实例:

target_link_libraries(main hello) //hello动态库链接到可执行文件main

10.add_subdirectory 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
代码实例:

add_subdirectory(src)  //添加src子目录,src中需要一个CMakeList.txt

11.aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个变量临时被用来自动构建源文件列表
语法:aux_source_directory(dir VARIABlE)
代码实例:

aux_source_directory(. SRC) //定义SRC变量,其值为当前目录下所有的源代码文件
add_executable(main ${SRC}) //编译SRC变量所代表的源代码文件,生成main可执行文件

4.cmake常见变量

1.CMAKE_C_FLAGS和CMAKE_CXX_FLAGS
设置 C 或c++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。

代码实例:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS } -Wall") //在gcc编译选项中追加-Wall
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -std=c++11") //在gcc编译选项中追加-std=c++11

2.CMAKE_BUILD_TYPE
编译类型为Debug和Release
代码实例:

set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Release)

3.CMAKE_CXX_COMPILER 和CMAKE_C_COMPILER
设置c和c++,编译器

set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)

4.EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH
指定可执行文件和库文件的输出路径
代码实例:

set(LIBRARY_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${OUTPUT_PATH})

5.PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR

  • PROJECT_SOURCE_DIR 工程顶层目录,也就是顶层 CMakeLists.txt 源码所在目录
  • PROJECT_BINARY_DIR 工 程 BINARY_DIR , 也 就 是 顶 层 CMakeLists.txt 源 码
    的BINARY_DIR
    例如:
    文件结构如下
/home/chen/workplace/code_test/
	├── build
	├── CMakeLists.txt
	└── main.c

CMakeLists.txt文件内容如下:

 #CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project(HELLO)
message(${PROJECT_SOURCE_DIR})
message(${PROJECT_BINARY_DIR})

进入到 build目录下,执行 cmake:得到如下打印

/home/chen/workplace/code_test/cmake_test
/home/chen/workplace/code_test/cmake_test/build

6.CMAKE_SOURCE_DIR和CMAKE_BINARY_DIR
CMAKE_SOURCE_DIR 与 PROJECT_SOURCE_DIR 等价
CMAKE_BINARY_DIR 与 PROJECT_BINARY_DIR 等价

7.CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR 当前源码所在路径,也就是CMakeLists.txt完整路径
CMAKE_CURRENT_BINARY_DIR 当前源码的 BINARY_DIR

5.CMAKE添加宏,控制测试代码

使用add_definitions可以添加宏
代码实例:

add_definitions(-DF_UBUNTU)
等价于
#define F_UBUNTU 1

或者

 cmake -DUSE_MACRO=on   //开启
 cmake -DUSE_MACRO=off  //关闭

6.cmake添加模板

.cmake文件是一个’模块(module)文件’,可以被’include’到CMakeLists.txt中,
备注: cmake’脚本’不要包含’工程之类’的信息 -->例如:add_subdirectory()、CMAKE_CURRENT_之类的,
cmake’不要’调用CMakeLists.txt
代码实例:

CMakeLists.txt文件中添加下列代码

include(${CMAKE_CURRENT_LIST_DIR}/cmake_conf/common.cmake) 

common.cmake内容如下

# 生成静态库通用宏
macro(add_static_lib _name _path)

    file(GLOB_RECURSE SRC_FILES   "${_path}/*.c")
    file(GLOB_RECURSE HEAD_FILES  "${_path}/*.h"  "./*.h"  )
    add_library(${_name} STATIC ${SRC_FILES} ${HEAD_FILES})

    #后面所有参数添加连接库
    foreach(_lib_item ${ARGN})
        target_link_libraries(${_name} ${_lib_item})
    endforeach(_lib_item)

endmacro(add_static_lib)

# the name of the target operating system
set(CMAKE_SYSTEM_NAME linux)
# which compilers to use
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
# adjust the default behaviour of the find commands:
# search headers and libraries in the target environment
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
# search programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

7.CMake简单代码实例

1.工程代码结构,遵循所有源文件放在src目录,所有头文件放在include目录,所有库放在lib目录下
在这里插入图片描述
2.CMakeLists.txt文件内容

#cmake version required
cmake_minimum_required (VERSION 3.12)

project(Test VERSION 1.2 LANGUAGES "CXX")

message("cmake_project_version = ${CMAKE_PROJECT_VERSION}")
message("project_version = ${PROJECT_VERSION}")
message("project_major_version= ${PROJECT_VERSION_MAJOR}")
message("project_minor = ${PROJECT_VERSION_MINOR}")

set(LIBRARY_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

message("executable_output_path = ${EXECUTABLE_OUTPUT_PATH}") 
message("library_output_path = ${LIBRARY_OUTPUT_PATH}")


message("cmake current source_dir =${CMAKE_CURRENT_SOURCE_DIR}")
message("cmake_current_binray_dir =${CMAKE_CURRENT_BINARY_DIR}")

message("project_source_dir = ${PROJECT_SOURCE_DIR}")
message("project_binray_dir = ${PROJECT_BINARY_DIR}")

message("cmake source dir = ${CMAKE_SOURCE_DIR}")
message("cmake_binray_dir =${CMAKE_BINARY_DIR}")

#configure_file(<input> <output>
#               [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
#                FILE_PERMISSIONS <permissions>...]
#               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
#               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
# option(variable_name "help message" value(bool OFF or ON)

set(DEMO_DATE "2020-8-17")

option(VERSION_ENABLE "version output" ON)
if(VERSION_ENABLE)
    set(DEMO_VERSION "12-34-56")
endif()

configure_file(${PROJECT_SOURCE_DIR}/include/version.h.in 
	${PROJECT_SOURCE_DIR}/include/version.h
)

add_executable(demo ${PROJECT_SOURCE_DIR}/src/main.cpp)

#为demo添加使用的头文件
target_include_directories(demo PUBLIC
	${PROJECT_SOURCE_DIR}/include/
                           )
#为所有文件添加使用的头文件                           
include_directories(${PROJECT_SOURCE_DIR}/include)

3.cmake工程构建

进入根目录,执行
mkdir build
cd build
cmake ..
cmake --build . //生成的可执行文件demo在,build/bin/demo

4.main.cpp文件内容

#include <iostream>
#include "version.h"

using namespace std;

int main(){
   std::cout<<"hello world"<<endl;
   std::cout<<"demo_major_version:"<<Test_VERSION_MAJOR<<endl;
   std::cout<<"demo_minor_version:"<<Test_VERSION_MINOR<<endl;
#ifdef DEMO_VERSION
   std::cout<<"define demo version:"<<DEMO_VERSION<<endl;
#endif
   std::cout<<"Date:"<<DATE<<endl;

   return 0;
}

5.version.h.in文件内容,
其中version.h是由version.h.in通过CMakeLists.txt构建生成的

#define Test_VERSION_MAJOR @Test_VERSION_MAJOR@
#define Test_VERSION_MINOR @Test_VERSION_MINOR@

#define DATE "${DEMO_DATE}"

#cmakedefine DEMO_VERSION "${DEMO_VERSION}"

8. CMAKE生成静态库通用宏

此模块可以作为一个通用模块,会自动搜寻指定目录下的.c和.h

#file name@common.cmake
# 生成静态库通用宏
macro(add_static_lib _name _path)

    file(GLOB_RECURSE SRC_FILES   "${_path}/*.c")
    file(GLOB_RECURSE HEAD_FILES  "${_path}/*.h"  "./*.h"  )
    add_library(${_name} STATIC ${SRC_FILES} ${HEAD_FILES})

    #后面所有参数添加连接库
    foreach(_lib_item ${ARGN})
        target_link_libraries(${_name} ${_lib_item})
    endforeach(_lib_item)

endmacro(add_static_lib)

在cmake中使用

include(${CMAKE_CURRENT_LIST_DIR}/common.cmake)
add_static_lib(my_lib my_lib) 

参考定义

 - "macro(add_static_lib _name _path)"
 -  add_static_lib :函数名
 - _name:静态库的名字
 - _path:生成静态库依赖文件路径

9. Cmake 中添加宏定义

1.添加一个TEST宏定义
示例如下

add_definitions(-DTEST)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值