linux - CMakeLists文件install的使用

变量

  • CMAKE_INSTALL_PREFIX
    用于指定cmake install时的相对地址前缀。
    (1)编译指定: cmake -DCMAKE_INSTALL_PREFIX=/usr/bin
    (2)文件指定: set(CMAKE_INSTALL_PREFIX /usr/bin)

install命令

目标文件

  • 使用方法
 install(TARGETS targets... [EXPORT <export-name>]
         [[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
           PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
          [DESTINATION <dir>]
          [PERMISSIONS permissions...]
          [CONFIGURATIONS [Debug|Release|...]]
          [COMPONENT <component>]
          [NAMELINK_COMPONENT <component>]
          [OPTIONAL] [EXCLUDE_FROM_ALL]
          [NAMELINK_ONLY|NAMELINK_SKIP]
         ] [...]
         [INCLUDES DESTINATION [<dir> ...]]
  )
    1. 目标文件类型
       静态库:  ARCHIVE
       动态库:  LIBRARY
       可执行二进制文件: RUNTIME
       与库关联的PUBLIC头文件: PUBLIC_HEADER
       与库关联的PRIVATE头文件: PRIVATE_HEADER
        	
    2. 参数含义
       DESTINATION:指定磁盘上要安装文件的目录;
       PERMISSIONS:指定安装文件的权限;
            有效权限: OWNER_READ,OWNER_WRITE,OWNER_EXECUTE,
                     GROUP_READ,GROUP_WRITE,GROUP_EXECUTE,
                     WORLD_READ,WORLD_WRITE,WORLD_EXECUTE,
                     SETUID和SETGID;
       CONFIGURATIONS:指定安装规则适用的构建配置列表(DEBUG或RELEASE等);
       COMPONENT:指定了该安装规则相关的一个安装部件的名字,如“runtime”;
       EXCLUDE_FROM_ALL:指定该文件从完整安装中排除,仅作为特定于组件的安装的一部分进行安装;
       OPTIONAL:如果要安装的文件不存在,则指定不是错误。

    3. 使用案例:
       install(TARGETS bin_test
               RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/bin)
       install(TARGETS lib_test
               LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/lib)

普通文件

  • 使用方法
install(<FILES|PROGRAMS> files...
        TYPE <type> | DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
1. 参数含义
   FILES:为普通的文本文件
   PROGRAMS:指的是非目标文件的可执行程序(如脚本文件)
   TYPE:输入TYPE 不需要填写DESTINATION,使用默认的路径
   RENAME:指定已安装文件的名称。仅当命令安装了单个文件时,才允许重命名。
   其他参数同上

2. 使用案例
   install(FILES  ${PROJECT_SOURCE_DIR}/libtest.so
           DESTINATION ${PROJECT_SOURCE_DIR}/install/usr/bin_test
           PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)

目录

  • 使用方法
install(DIRECTORY dirs...
        TYPE <type> | DESTINATION <dir>
        [FILE_PERMISSIONS permissions...]
        [DIRECTORY_PERMISSIONS permissions...]
        [USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>] [EXCLUDE_FROM_ALL]
        [FILES_MATCHING]
        [[PATTERN <pattern> | REGEX <regex>]
        [EXCLUDE] [PERMISSIONS permissions...]] [...])
1. 参数含义
   dirs:目录名不以/结尾,包含目录本身,目录名以 / 结尾,目录下的内容,不包括目录本身。 
   PATTERN或REGEX:以精细的粒度控制目录的安装,可以指定一个通配模式或正则表达式对输入目录过滤;
         PATTERN仅匹配完整的文件名
         REGEX将匹配文件名的任何部分,但它可以使用 / 和 $ 模拟PATTERN行为。
         PATTERN或REGEX表达式后的参数,仅应用于满足表达式的文件或目录
   EXCLUDE选项:跳过匹配的文件或目录
   PERMISSIONS选项:覆盖匹配文件或目录的权限设置。

2. 使用案例
  install(DIRECTORY test1 test2/ DESTINATION share/test
          FILES_MATCHING PATTERN "*.h"
          PATTERN "CVS" EXCLUDE
          PATTERN "test2/*"
          PERMISSIONS OWNER_WRITE)
          将test1目录安装到share/test,将scripts/中的内容安装到share/test
          从目录中得到头文件
          两个目录均不包含目录名为CVS的子目录
          对于scripts/*的文件指定权限OWNER_WRITE

脚本的运行

  • 使用方法
install([[SCRIPT <file>] [CODE <code>]]
        [COMPONENT <component>] [EXCLUDE_FROM_ALL] [...])
1. SCRIPT参数:在安装过程中调用给定的CMake脚本文件(即.cmake脚本文件)
              如果脚本文件名是相对路径,则将相对于当前源目录进行解释;
   CODE参数:在安装过程中调用给定的CMake代码;
            将代码指定为双引号字符串内的单个参数;
2. 使用案例
   install(CODE "MESSAGE(\"Sample install message.\")")
   这条命令将会在install的过程中执行cmake代码,打印语句。

export

功能: 导出目标供外部使用

  • 使用方法
install(EXPORT <export-name> DESTINATION <dir>
        [NAMESPACE <namespace>] [FILE <name>.cmake]
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [EXPORT_LINK_INTERFACE_LIBRARIES]
        [COMPONENT <component>])
  1. 使用案例
install(TARGETS myexe EXPORT myproj DESTINATION bin)
install(EXPORT myproj NAMESPACE mp_ DESTINATION lib/myproj)
目录结构:
   my_library
   -- cmake
  		-- MyLibraryConfig.cmake
   -- include
  		-- my_library
     		-- my_library.h
   -- src
  		-- my_library.cpp
   -- CMakeLists.txt

编译:
project(MyLibrary VERSION 1.0.0 LANGUAGES CXX)
find_package(OpenCV REQUIRED)

add_library(MyLibrary)
target_compile_features(MyLibrary PRIVATE cxx_std_11)
target_sources(MyLibrary PRIVATE src/my_library.cpp)
target_include_directories(MyLibrary
       PUBLIC
           $<INSTALL_INTERFACE:include>
           $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
       PRIVATE
           ${OpenCV_INCLUDE_DIRS}
       )
target_link_libraries(MyLibrary PRIVATE ${OpenCV_LIBRARIES})

// 拷贝库到系统目录下
include(GNUInstallDirs)
install(TARGETS MyLibrary   EXPORT MyLibraryTargets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} )

// 拷贝MyLibraryTargets.cmake自动生成目标文件到cmake系统目录
install(EXPORT MyLibraryTargets    FILE MyLibraryTargets.cmake
        NAMESPACE MyLibrary::
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary)

// 拷贝头文件
install(DIRECTORY include/
        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

// 拷贝MyLibraryConfig.cmake文件到cmake系统目录,用途是让使用者通过find_packge找到这个库
install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/MyLibraryConfig.cmake
       DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary)

MyLibraryConfig.cmake 文件

get_filename_component(MyLibrary_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
// 找到依赖库
include(CMakeFindDependencyMacro)
find_dependency(OpenCV REQUIRED)

// 导入MyLibraryTargets.cmake,文件保存了声明的各种依赖的名称和路径。
if(NOT TARGET MyLibrary::MyLibrary)
    include("${MyLibrary_CMAKE_DIR}/MyLibraryTargets.cmake")
endif()

注: 执行程序可通过 find_package(MyLibrary REQUIRED) 找到并链接库

  • 15
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值