30分钟掌握CMake基本操作

文章目录

  • 一、文件树和CMakeLists.txt一览
    • 语法基本规则
    • 文件树讲解
      • build目录
      • COPYRIGHT文件
      • doc目录
      • README文件
      • run.sh文件
      • src目录
      • src/lib
  • 二、基本指令讲解
    • 1.CMAKE_MINIMUM_REQUIRED(VERSION XXX)
    • 2.PROJECT(projectname)
    • 3.SET(CMAKE_CXX_STANDARD 17)
    • 4.ADD_SUBDIRECTORY(src bin)
    • 5.INCLUDE_DIRECTORIES(lib/)
    • 6.ADD_EXECUTABLE(main main.cpp)
    • 7.TARGET_LINK_LIBRARIES(参数一;参数二)
    • 8.SET()
    • 9.FIND_PACKAGE()
  • 三、构建和安装同名静态库和动态库
    • 静态库和动态库的区别
    • 构建指令
      • 1.ADD_LIBRARY
      • 2.SET_TARGET_PROPERTIES
    • 安装指令
      • INSTALL()
      • 安装文件类型与关键字对应关系


一、文件树和CMakeLists.txt一览

30分钟掌握CMake基本操作_第1张图片
30分钟掌握CMake基本操作_第2张图片
30分钟掌握CMake基本操作_第3张图片
30分钟掌握CMake基本操作_第4张图片

语法基本规则

  • 变量在使用时加${},但在IF控制语句中不加(基本也用不到)
  • 参数与参数之间用 " ; " 或者 " " 分隔
  • 指令不区分大小写,参数和变量区分大小写

文件树讲解

build目录

用来执行编译和安装

COPYRIGHT文件

用来存放版权信息

doc目录

用来存放一些说明文档

README文件

用来存放基本项目说明

run.sh文件

一键调用的脚本文件

src目录

存放源码的目录

src/lib

存放可能需要安装的库文件

二、基本指令讲解

1.CMAKE_MINIMUM_REQUIRED(VERSION XXX)

指定最低版本要求

2.PROJECT(projectname)

参数一:生成工程的名字
可选参数二:使用的编程语言。可以不指定编程语言,自动识别(recommended)

3.SET(CMAKE_CXX_STANDARD 17)

设置C++标准

4.ADD_SUBDIRECTORY(src bin)

在./src/目录下寻找并链接下一个CMakeLists.txt,然后在编译目录下生成一个bin目录,并且在bin目录下执行下一个CMakeLists.txt里面的语句
参数一:下一个CMakeLists.txt的目录
可选参数二:为下一个下一个CMakeLists.txt指定一个目录去执行

5.INCLUDE_DIRECTORIES(lib/)

添加头文件搜索的路径./lib/

  • 在Linux系统中,默认的头文件搜索路径是/usr/include和/usr/local/include

6.ADD_EXECUTABLE(main main.cpp)

将main.cpp文件生成可执行文件
参数一:生成的可执行文件的名字
参数二:含main函数的文件名或者变量

  • INCLUDE_DIRECTORIES指令要放在ADD_EXECUTABLE的前面
  • TARGET_LINK_LIBRARIES指令要放在ADD_EXECUTABLE的后面

7.TARGET_LINK_LIBRARIES(参数一;参数二)

链接某个库到可执行文件
参数一:可执行文件名,一般是main
参数二:库文件的路径

  • 在Linux系统中,默认的库文件搜索路径是/usr/lib

8.SET()

SET(LIB_LIST projectname.h
             authority.h
             filename/filename.h
             filename/filename.cpp    )

将projectname.h、authority.h、filename/filename.h、filename/filename.cpp 这四个文件定义为变量LIB_LIST
参数一:要定义的变量名
参数二:要定义的东西

9.FIND_PACKAGE()

在使用OpenCV库时,常常使用此指令来找到OpenCV的包

FIND_PACKAGE(OpenCV REQUIRED)

三、构建和安装同名静态库和动态库

静态库和动态库的区别

  • 静态库拓展名为" .a " 和 " .lib " ,动态库拓展名为" .so " 和 " .dll "
  • 静态库在编译时会整合到目标可执行文件中,生成的可执行文件可以独立运行
  • 动态库在编译时不会整合到目标可执行文件中,生成的可执行文件不可以独立运行

构建指令

1.ADD_LIBRARY

ADD_LIBRARY(projectname_static STATIC ${LIB_LIST} )
ADD_LIBRARY(projectname_shared SHARED ${LIB_LIST} )

将变量LIB_LIST生成静态库文件libprojectname_static.so
将变量LIB_LIST生成动态态库文件libprojectname_shared.h
参数一:生成的库文件名
参数二:静态库(STATIC)或动态库(SHARED)
参数三:源代码文件或变量

  • 在CMake的机制中,以上两条指令被认为是构建了同名的库,如果不进行属性设置,那么在编译时会自动进行覆盖

2.SET_TARGET_PROPERTIES

SET_TARGET_PROPERTIES(projectname_static PROPERTIES 
                      OUTPUT_NAME "projectname"
                      CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(projectname_shared PROPERTIES 
                      OUTPUT_NAME "projectname"
                      CLEAN_DIRECT_OUTPUT 1)

将两个库文件名都重命名为 " projectname ",并且指定输出时不清除同名文件
参数一:输出文件的名字
参数二:PROPERTIES,表示设置属性
参数OUTPUT_NAME:重命名
参数CLEAN_DIRECT_OUTPUT:输出形式

  • 除此之外,还有很多参数可以选择

安装指令

INSTALL()

INSTALL(FILES projectname.h DESTINATION include/projectname/)
INSTALL(FILES authority.h DESTINATION include/projectname/)
INSTALL(TARGETS projectname_static projectname_shared 
        LIBRARY DESTINATION lib/projectname/
        ARCHIVE DESTINATION lib/projectname/ )  

将文件projectname.h、authority.h、projectname_static、projectname_shared安装到指定位置
参数一:要安装的文件类型
参数二:要安装的文件名字
参数DESTINATION:安装路径
参数LIBRARY DESTINATION:静态库安装路径
参数ARCHIVE DESTINATION:动态库安装路径

安装文件类型与关键字对应关系

关键字 文件类型
TARGETS 库文件、头文件
FILES 一般文件
PROGRAMS 脚本文件
DIRECTORY 文本文件

你可能感兴趣的:(linux,c++,windows)