【CMake】掌握CMake基本操作

cnblogs 2024-08-15 13:09:00 阅读 63

@

目录

  • 1.文件树和CMakeLists.txt一览
    • 1.1 语法基本规则
    • 1.2 文件目录讲解
  • 2.基本指令讲解
    • 2.1 CMAKE_MINIMUM_REQUIRED(VERSION XXX)
    • 2.2 PROJECT(projectname)
    • 2.3 SET()
    • 2.4 ADD_SUBDIRECTORY(src bin)
    • 2.5 INCLUDE_DIRECTORIES(lib/)
    • 2.6 ADD_EXECUTABLE(main main.cpp)
    • 2.7 ADD_LIBRARY(参数一 参数二(STATIC/SHARED) 参数二)
    • 2.8 TARGET_LINK_LIBRARIES(参数一;参数二)
    • 2.9 FIND_PACKAGE()
  • 3.构建和安装同名静态库和动态库
    • 3.1 静态库和动态库的区别
    • 3.2 构建指令
      • 3.2.1 ADD_LIBRARY
      • 3.2.2 SET_TARGET_PROPERTIES
    • 3.3 安装指令
      • 3.3.1 INSTALL()
      • 3.3.2 安装文件类型与关键字对应关系

1.文件树和CMakeLists.txt一览

  • 文件树

<code>xu736946693@ubuntu:~/Desktop/CMake-template$ tree -L 3

.

├── cmake

│ ├── ProjectXXConfig.cmake.in

│ └── ProjectXXConfigVersion.cmake.in

├── CMakeLists.txt

├── doc

│ └── READMEimgRes

│ └── 8836961877de48e1ada55af7810b1457.png

├── lib

│ ├── authority.h

│ ├── Module1

│ │ ├── filename.cpp

│ │ └── filename.h

│ └── projectname.h

├── LICENSE

├── main.cpp

├── README.md

├── run.sh

└── settings.zip

  • CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_CXX_STANDARD 17)

# 设置库的名称

set(LIB_NAME ProjectXX)

# 设置可执行文件的名字

PROJECT(${LIB_NAME}_exe)

#设置版本

set(version 1.0)

# 拼接名字

set(LIB_NAME_VERSION ${LIB_NAME}-${version})

#设置安装位置,将头文件和库都安装到这个文章

set(CMAKE_INSTALL_PREFIX /usr/local/)

# 依赖的外部库

#find_package(OpenCV REQUIRED)

# 自己的库依赖的头文件

include_directories(

${CMAKE_CURRENT_SOURCE_DIR}

${CMAKE_CURRENT_BINARY_DIR}

lib

lib/Module1

# 以下为外部依赖

# ${OpenCV_INCLUDE_DIRS}

)

file(GLOB_RECURSE source

lib/*.hpp

lib/*.cpp

lib/Module1/*.cpp

lib/Module1/*.hpp

)

file(GLOB_RECURSE include

lib/*.h

lib/Module1/*.h

)

# ----------------- 静态库 -----------------

add_library(${LIB_NAME} STATIC ${source})

target_link_libraries(${LIB_NAME} PUBLIC

# 以下为静态库的外部依赖

# ${OpenCV_LIBS}

)

# ----------------- 可执行文件 -----------------

# 可执行文件生成

add_executable(${PROJECT_NAME} main.cpp)

# 设置可执行文件的依赖

target_link_libraries(${PROJECT_NAME}

# 静态库

${LIB_NAME}

# 以下为外部依赖

# ${OpenCV_LIBS}

)

# ----------------- 结束可执行文件的生成 -----------------

# ----------------- 生成 CMake 配置文件(不需要修改) -----------------

# 生成 CMake 配置文件

include(CMakePackageConfigHelpers)

configure_package_config_file(

${CMAKE_CURRENT_SOURCE_DIR}/cmake/${LIB_NAME}Config.cmake.in

${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}Config.cmake

INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/

)

configure_package_config_file(

${CMAKE_CURRENT_SOURCE_DIR}/cmake/${LIB_NAME}ConfigVersion.cmake.in

${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake

INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/

)

# 安装 CMake 配置文件

install(FILES

${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}Config.cmake

${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake

DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/

)

# ----------------- 结束生成 CMake 配置文件 -----------------

# ----------------- 安装(不需要修改) -----------------

# 安装源码文件

install(FILES ${include}

DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_NAME_VERSION}/

)

# 安装静态库、可执行文件

install(TARGETS ${LIB_NAME} ${PROJECT_NAME}

EXPORT ${LIB_NAME_VERSION}-targets

RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/${LIB_NAME_VERSION}/

ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/

)

# 安装导出文件

install(EXPORT ${LIB_NAME_VERSION}-targets

NAMESPACE "${LIB_NAME}::"

DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/

)

# ----------------- 结束安装 -----------------

1.1 语法基本规则

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

1.2 文件目录讲解

  • cmake-build-debug目录:用来执行编译和安装
  • cmake目录:用来CMakeLists.txt的配置文件
  • doc目录:用来存放说明文档
  • lib目录:用来存放库文件
  • LICENSE文件:用来存放版权信息
  • main.cpp:用来存放程序的入口
  • README.md:用来存放基本项目说明
  • run.sh:一键调用的脚本文件
  • settings.zip:用来存放一些配置文件

2.基本指令讲解

2.1 CMAKE_MINIMUM_REQUIRED(VERSION XXX)

指定最低版本要求

2.2 PROJECT(projectname)

参数一:生成工程的名字

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

2.3 SET()

set()指令可以创建一个变量并赋值,此处SET(CMAKE_CXX_STANDARD 17)表示设置CMAKE_CXX_STANDARD这个变量为17,即设置C++标准为17。

2.4 ADD_SUBDIRECTORY(src bin)

在./src/目录下寻找并链接下一个CMakeLists.txt,然后在编译目录下,即cmake-build-debug目录下生成一个bin目录,并且在bin目录下执行下这个子CMakeLists.txt里面的语句

参数一:包含子CMakeLists.txt的目录

可选参数二:为子CMakeLists.txt创建一个指定名字的目录去执行,若不给出此参数,则自动在cmake-build-debug目录下执行子CMakeLists.txt的语句

2.5 INCLUDE_DIRECTORIES(lib/)

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

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

2.6 ADD_EXECUTABLE(main main.cpp)

将main.cpp文件生成可执行文件

参数一:生成的可执行文件的名字

参数二:含main函数的一个或者多个文件名

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

2.7 ADD_LIBRARY(参数一 参数二(STATIC/SHARED) 参数二)

打包一些源代码生成一个库文件

参数一:生成的库文件的名字

参数二:可选STATIC或者SHARED,表示生成的是静态库或者动态库

参数三:一个或者多个源代码文件

2.8 TARGET_LINK_LIBRARIES(参数一;参数二)

链接某个库到可执行文件

参数一:使用ADD_EXECUTABLE生成的可执行文件的名字

参数二:库文件的路径

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

2.9 FIND_PACKAGE()

在使用第三方库时,常常使用此指令来找到第三方的库,如:

FIND_PACKAGE(OpenCV REQUIRED)

此指令会自动在/usr/lib/cmake/usr/share/cmake/usr/lib/x86_64-linux-gnu/cmake/snap/cmake等等这样的安装路径去寻找类似于XXConfig.cmake这样的配置文件。

如果是自行下载的库,没有进行安装的话,只需要添加指令:

set(CMAKE_PREFIX_PATH /path/to/libA;/path/to/libB)

这样就增加了cmake寻找库的路径。

3.构建和安装同名静态库和动态库

3.1 静态库和动态库的区别

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

3.2 构建指令

3.2.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的机制中,以上两条指令被认为是构建了同名的库,如果不进行属性设置,那么在编译时会自动进行覆盖

3.2.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:输出形式

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

3.3 安装指令

3.3.1 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:静态库安装路径

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

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

本文由博客一文多发平台 OpenWrite 发布!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。