【CMake】掌握CMake基本操作

打印 上一主题 下一主题

主题 898|帖子 898|积分 2694

@
目录

1.文件树和CMakeLists.txt一览


  • 文件树
  1. xu736946693@ubuntu:~/Desktop/CMake-template$ tree  -L 3
  2. .
  3. ├── cmake
  4. │   ├── ProjectXXConfig.cmake.in
  5. │   └── ProjectXXConfigVersion.cmake.in
  6. ├── CMakeLists.txt
  7. ├── doc
  8. │   └── READMEimgRes
  9. │       └── 8836961877de48e1ada55af7810b1457.png
  10. ├── lib
  11. │   ├── authority.h
  12. │   ├── Module1
  13. │   │   ├── filename.cpp
  14. │   │   └── filename.h
  15. │   └── projectname.h
  16. ├── LICENSE
  17. ├── main.cpp
  18. ├── README.md
  19. ├── run.sh
  20. └── settings.zip
复制代码

  • CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.16)
  2. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  3. set(CMAKE_CXX_STANDARD 17)
  4. # 设置库的名称
  5. set(LIB_NAME ProjectXX)
  6. # 设置可执行文件的名字
  7. PROJECT(${LIB_NAME}_exe)
  8. #设置版本
  9. set(version 1.0)
  10. # 拼接名字
  11. set(LIB_NAME_VERSION ${LIB_NAME}-${version})
  12. #设置安装位置,将头文件和库都安装到这个文章
  13. set(CMAKE_INSTALL_PREFIX /usr/local/)
  14. # 依赖的外部库
  15. #find_package(OpenCV REQUIRED)
  16. # 自己的库依赖的头文件
  17. include_directories(
  18.         ${CMAKE_CURRENT_SOURCE_DIR}
  19.         ${CMAKE_CURRENT_BINARY_DIR}
  20.         lib
  21.         lib/Module1
  22.         # 以下为外部依赖
  23.         # ${OpenCV_INCLUDE_DIRS}
  24. )
  25. file(GLOB_RECURSE source
  26.         lib/*.hpp
  27.         lib/*.cpp
  28.         lib/Module1/*.cpp
  29.         lib/Module1/*.hpp
  30.         )
  31. file(GLOB_RECURSE include
  32.         lib/*.h
  33.         lib/Module1/*.h
  34.         )
  35. # ----------------- 静态库 -----------------
  36. add_library(${LIB_NAME} STATIC ${source})
  37. target_link_libraries(${LIB_NAME} PUBLIC
  38.         # 以下为静态库的外部依赖
  39.         # ${OpenCV_LIBS}
  40.         )
  41. # ----------------- 可执行文件 -----------------
  42. # 可执行文件生成
  43. add_executable(${PROJECT_NAME}  main.cpp)
  44. # 设置可执行文件的依赖
  45. target_link_libraries(${PROJECT_NAME}
  46.         # 静态库
  47.         ${LIB_NAME}
  48.         # 以下为外部依赖
  49.         # ${OpenCV_LIBS}
  50.         )
  51. # ----------------- 结束可执行文件的生成 -----------------
  52. # ----------------- 生成 CMake 配置文件(不需要修改) -----------------
  53. # 生成 CMake 配置文件
  54. include(CMakePackageConfigHelpers)
  55. configure_package_config_file(
  56.         ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${LIB_NAME}Config.cmake.in
  57.         ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}Config.cmake
  58.         INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/
  59. )
  60. configure_package_config_file(
  61.         ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${LIB_NAME}ConfigVersion.cmake.in
  62.         ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake
  63.         INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/
  64. )
  65. # 安装 CMake 配置文件
  66. install(FILES
  67.         ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}Config.cmake
  68.         ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}ConfigVersion.cmake
  69.         DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/
  70.         )
  71. # ----------------- 结束生成 CMake 配置文件 -----------------
  72. # ----------------- 安装(不需要修改) -----------------
  73. # 安装源码文件
  74. install(FILES ${include}
  75.         DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIB_NAME_VERSION}/
  76.         )
  77. # 安装静态库、可执行文件
  78. install(TARGETS ${LIB_NAME} ${PROJECT_NAME}
  79.         EXPORT ${LIB_NAME_VERSION}-targets
  80.         RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin/${LIB_NAME_VERSION}/
  81.         ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/
  82.         )
  83. # 安装导出文件
  84. install(EXPORT ${LIB_NAME_VERSION}-targets
  85.         NAMESPACE "${LIB_NAME}::"
  86.         DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIB_NAME_VERSION}/
  87.         )
  88. # ----------------- 结束安装 -----------------
复制代码
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()

在利用第三方库时,常常利用此指令来找到第三方的库,如:
  1. FIND_PACKAGE(OpenCV REQUIRED)
复制代码
此指令会自动在/usr/lib/cmake、/usr/share/cmake、/usr/lib/x86_64-linux-gnu/cmake、/snap/cmake等等这样的安装路径去寻找类似于XXConfig.cmake这样的配置文件。
如果是自行下载的库,没有进行安装的话,只需要添加指令:
  1. 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
  1. ADD_LIBRARY(projectname_static STATIC ${LIB_LIST} )
  2. 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
  1. SET_TARGET_PROPERTIES(projectname_static PROPERTIES
  2.                       OUTPUT_NAME "projectname"
  3.                       CLEAN_DIRECT_OUTPUT 1)
  4. SET_TARGET_PROPERTIES(projectname_shared PROPERTIES
  5.                       OUTPUT_NAME "projectname"
  6.                       CLEAN_DIRECT_OUTPUT 1)
复制代码
将两个库文件名都重命名为 " projectname ",而且指定输出时不扫除同名文件
参数一:输出文件的名字
参数二:PROPERTIES,表示设置属性
参数OUTPUT_NAME:重命名
参数CLEAN_DIRECT_OUTPUT:输出形式

  • 除此之外,还有很多参数可以选择
3.3 安装指令

3.3.1 INSTALL()
  1. INSTALL(FILES projectname.h DESTINATION include/projectname/)
  2. INSTALL(FILES authority.h DESTINATION include/projectname/)
  3. INSTALL(TARGETS projectname_static projectname_shared
  4.         LIBRARY DESTINATION lib/projectname/
  5.         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 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表