@TOC
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
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}/ ) # ----------------- 结束安装 -----------------
指定最低版本要求
参数一:生成工程的名字
可选参数二:使用的编程语言。可以不指定编程语言,自动识别(recommended)
set()
指令可以创建一个变量并赋值,此处SET(CMAKE_CXX_STANDARD 17)
表示设置CMAKE_CXX_STANDARD
这个变量为17
,即设置C++标准为17。
在./src/目录下寻找并链接下一个CMakeLists.txt,然后在编译目录下,即cmake-build-debug目录下生成一个bin目录,并且在bin目录下执行下这个子CMakeLists.txt里面的语句
参数一:包含子CMakeLists.txt的目录
可选参数二:为子CMakeLists.txt创建一个指定名字的目录去执行,若不给出此参数,则自动在cmake-build-debug目录下执行子CMakeLists.txt的语句
添加头文件搜索的路径./lib
将main.cpp文件生成可执行文件
参数一:生成的可执行文件的名字
参数二:含main函数的一个或者多个文件名
打包一些源代码生成一个库文件
参数一:生成的库文件的名字
参数二:可选STATIC或者SHARED,表示生成的是静态库或者动态库
参数三:一个或者多个源代码文件
链接某个库到可执行文件
参数一:使用ADD_EXECUTABLE
生成的可执行文件的名字
参数二:库文件的路径
在使用第三方库时,常常使用此指令来找到第三方的库,如:
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寻找库的路径。
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)
参数三:源代码文件或变量
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(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 | 文本文件 |