一、内容概述本篇为本系列的最后一篇,cmake内容较多。掌握这四篇文章就可以满足常规项目的需要了。所谓标准工程的“标准工程”,是指发布结构符合以下标准的工程:头文件位于“/usr/local/include”,库文件位于“/usr/local”/lib”,可执行文件位于“/usr/local/bin”,这种发布方式多适用于作为标准库或第三方库发布。优点:非常方便第三方开发者使用引用头文件和库文件缺点:遇到同名或不同版本的库时,可能会误引用其他库文件发布项目所谓的“发布项目”指的是共享库、可执行程序等.像Qt.需要的库文件和头文件没有发布到标准的“/usr/local”相关目录下,而是与应用程序位于同级目录或上级下级目录的情况下,本次发布方法多适用于一套完整的可执行程序系统。优点:可以保证引用的库是自己提供的依赖库,不会污染标准库文件。缺点:相关库文件仅限于项目本身,不适合被其他库或可执行程序复用。两个示例程序涉及的头文件和源文件,请参考《CMake学习3 - 渐入佳境》相关文件内容。2.基础项目2.1项目描述本项目是“标准项目”和“发布项目”的基础版本,包含未经调整的公开基础代码,方便大家逐步掌握。基本结构CMakeLists.txt项目组织结构及构建规则include所有头文件src所有源文件安装目录头文件目录/usr/local/include库文件目录/usr/local/lib可执行文件/usr/local/binbuildoptions这些两个选项是可选的,但不是必需的。设置CMAKE_BUILD_TYPE构建Debug或Release版本(默认Release)设置BUILD_SHARED_LIBS构建共享库或静态库(默认静态库)构建步骤mkdirbuildcdbuildcmake..makesudomakeinstall2.2项目结构├──app│├──CMakeLists.txt│├──include│└──src│├──CMakeLists.txt│└──main.cpp├──CMakeLists.txt├──math│├──CMakeLists.txt│├──include││└──math││└──math.h│└──src│├──CMakeLists.txt│└──math.cpp└──ui├──CMakeLists.txt├──include│└──ui│├──button.h│├──edit.h│└──element.hpp└──src├──button.cpp├──CMakeLists.txt└──edit.cpp2.3文件内容CMakeLists.txt#所需cmake工具的最低版本cmake_minimum_required(VERSION3.1)#项目名称project(AppProject)#指定项目的构建类型(取值包括Debug、Release、RelWithDebInfo、MinSizeRel)set(CMAKE_BUILD_TYPERelease)#一共生成共享库或静态库(取值包括on、off)set(BUILD_SHARED_LIBSon)#包含子项目add_subdirectory(math)add_subdirectory(ui)add_subdirectory(app)app/CMakeLists.txtproject(app)add_subdirectory(src)app/src/CMakeLists.txt#生成可执行程序add_executable(${PROJECT_NAME}main.cpp)#包含依赖的头文件target_include_directories(${PROJECT_NAME}PUBLIC"${App_SOURCE_DIR}/include""${Math_SOURCE_DIR}/include""${Ui_SOURCE_DIR}/include")#链接依赖动态库target_link_libraries(${PROJECT_NAME}MathUi)#安装可执行文件install(TARGETS${PROJECT_NAME}DESTINATION/usr/local/bin)math/CMakeLists.txtproject(Math)add_subdirectory(src)math/src/CMakeLists.txt#创建静态库或共享库add_library(${PROJECT_NAME}math.cpp)#包含依赖头文件target_include_directories(${PROJECT_NAME}PUBLIC${PROJECT_SOURCE_DIR}/include)#安装头文件install(DIRECTORY"${PROJECT_SOURCE_DIR}/include/"DESTINATION"/usr/local/include")#安装库文件install(TARGETS${PROJECT_NAME}DESTINATION/usr/local/lib)ui/CMakeLists.txtproject(Ui)add_subdirectory(src)ui/src/CMakeLists.txt#创建构建静态库或共享库add_library(${PROJECT_NAME}button.cppedit.cpp)#包含依赖头文件target_include_directories(${PROJECT_NAME}PUBLIC${PROJECT_SOURCE_DIR}/include)#安装头文件install(DIRECTORY"${PROJECT_SOURCE_DIR}/include/"DESTINATION"/usr/local/include")#安装库文件install(TARGETS${PROJECT_NAME}DESTINATION/usr/local/lib)3.标准工程3.1工程描述所有头文件和源文件都没有已修改仅涉及包含安装命令的CMakeLists.txt文件。思路是修改原来的绝对路径,通过顶层的变量实现路径控制。可以通过修改CMAKE_INSTALL_PREFIX变量来指定发布根目录的位置。可以通过修改INSTALL_INCLUDE_PATH变量来释放头文件。指定的位置。可以通过修改INSTALL_LIB_PATH变量来指定分发库文件目录的位置。可以通过修改INSTALL_BIN_PATH变量来指定分布式可执行文件的位置。3.2项目结构整体结构不变,仅列出有内容变更文件的项目结构。.├──app│└──src│└──CMakeLists.txt├──CMakeLists.txt├──math│└──src│└──CMakeLists.txt└──ui└──src└──CMakeLists.txt3.3文件内容CMakeLists.txt#所需cmake工具的最低版本cmake_minimum_required(VERSION3.1)#项目名称project(AppProject)#指定项目的构建类型(取值包括Debug、Release、RelWithDebInfo、MinSizeRel)#set(CMAKE_BUILD_TYPERelease)#生成共享库或静态库(取值包括on,off)#set(BUILD_SHARED_LIBSon)#指定安装根目录set(CMAKE_INSTALL_PREFIX"/usr/local")#指定头文件安装目录set(INSTALL_INCLUDE_PATH${CMAKE_INSTALL_PREFIX}/include)#指定库文件安装目录set(INSTALL_LIB_PATH${CMAKE_INSTALL_PREFIX}/lib)#指定可执行文件安装目录set(INSTALL_BIN_PATH${CMAKE_INSTALL_PREFIX}/bin)#includesubprojectadd_subdirectory(math)add_subdirectory(ui)add_subdirectory(app)app/src/CMakeLists.txt#生成可执行程序add_executable(${PROJECT_NAME}main.cpp)#包含依赖头文件target_include_directories(${PROJECT_NAME}PUBLIC"${App_SOURCE_DIR}/include""${Math_SOURCE_DIR}/include""${Ui_SOURCE_DIR}/include")#链接依赖动态库target_link_libraries(${PROJECT_NAME}MathUi)#安装库文件install(TARGETS${PROJECT_NAME}DESTINATION${INSTALL_BIN_PATH})math/src/CMakeLists.txt#创建静态库或共享库add_library(${PROJECT_NAME}math.cpp)#Includedependencyheader文件target_include_directories(${PROJECT_NAME}PUBLIC${PROJECT_SOURCE_DIR}/include)#安装头文件install(DIRECTORY"${PROJECT_SOURCE_DIR}/include/"DESTINATION${INSTALL_INCLUDE_PATH})#安装库文件install(TARGETS${MEJECT_NA{INSTALL_LIB_PATH})ui/src/CMakeLists.txt#创建静态库或共享库add_library(${PROJECT_NAME}button.cppedit.cpp)#包含依赖头文件target_include_directories(${PROJECT_NAME}PUBLIC${PROJECT_SOURCE_DIR}/include)#安装头文件install(DIRECTORY"${PROJECT_SOURCE_DIR}/include/"DESTINATION${INSTALL_INCLUDE_PATH})#安装库文件install(TARGETS${PROJECT_NAME}DESTINATION${INSTALL_LIB_PATH})4.发布项目该项目基于“标准项目”,只修改了顶层的CMakeLists.txt文件。4.1项目说明执行“makeinstall”命令后,安装到当前目录的deploy目录。该目录下的程序调用使用相对路径,deploy目录可以移动到任意位置。deploy目录中的目录结构无法调整,因为相对路径被写入'rpath'。4.2项目结构修改文件结构。└──安装目录结构。├──app├──include└──lib4.3文件内容CMakeLists.txt#需要cmake工具的最低版本cmake_minimum_required(VERSION3.1)#项目名称project(AppProject)#指定项目的构建类型(值包括Debug、Release、RelWithDebInfo、MinSizeRel)set(CMAKE_BUILD_TYPERelease)#生成共享库或静态库(值包括on、off)set(BUILD_SHARED_LIBSon)#安装时生成'rpath'set(CMAKE_SKIP_INSTALL_RPATHFALSE)#指定'rpath'路径set(CMAKE_INSTALL_RPATH"./lib")#指定安装根目录set(CMAKE_INSTALL_PREFIX"../deploy/")#指定头文件安装directoryset(INSTALL_INCLUDE_PATH${CMAKE_INSTALL_PREFIX}/include)#指定库文件安装目录set(INSTALL_LIB_PATH${CMAKE_INSTALL_PREFIX}/lib)#指定可执行文件安装目录set(INSTALL_BIN_PATH${CMAKE_INSTALL_PREFIX})#包含子项目add_subdirectory(math)add_subdirectory(ui)add_subdirectory(app)五、其他知识点5.1关于构建期的rpathrpath作用于makerpath后生成的可执行文件和库文件就够了,分发文件不在标准路径下。5.2关于卸载cmake没有官方的“makeuninstall”命令,因为官方不推荐从系统中删除文件。可以通过以下命令实现:sudoxargsrm
