Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake-导出目标,以便可以将其导入到另一个项目中并支持重新定位_Cmake - Fatal编程技术网

CMake-导出目标,以便可以将其导入到另一个项目中并支持重新定位

CMake-导出目标,以便可以将其导入到另一个项目中并支持重新定位,cmake,Cmake,下面的命令将生成my-targets-build-tree.cmake 但是,它将为所有目标的导入位置释放字段提供绝对路径 export( EXPORT my-targets FILE "${CMAKE_CURRENT_BINARY_DIR}/share/cmake/${PROJECT_NAME}/my-targets-build-tree.cmake" ) 这意味着我可以使用该文件将目标导入到另一个项目中,但前提是库未在磁盘上移动。意思事情是不可迁移的。。。i、

下面的命令将生成my-targets-build-tree.cmake 但是,它将为所有目标的导入位置释放字段提供绝对路径

export(
  EXPORT my-targets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/share/cmake/${PROJECT_NAME}/my-targets-build-tree.cmake"
)
这意味着我可以使用该文件将目标导入到另一个项目中,但前提是库未在磁盘上移动。意思事情是不可迁移的。。。i、 例如,你不能在另一台机器上随意移动包裹

有没有办法使生成的cmake文件支持包重新定位?例如,让他们考虑环境变量(

),使用命令告诉CFALE如何在安装它们时将磁盘放在磁盘上,并使用它们来创建配置文件,而不是<代码>出口()/< >:
set(MYLB\u INCLUDE\u INSTALL\u DESTINATION INCLUDE/my\u lib)
添加库(我的库…)
#需要在此处分别提供安装目录和构建目录中的位置
目标目录包括目录(my_lib PUBLIC
$
$)
安装(目标我的库导出我的库)
归档目标库#静态和导入库安装到库
库目标库#。因此安装到库
运行时目标bin#。已安装到bin的DLL
)
#安装包含要包含/my_lib的公共头的目录
安装(目录包括目标${MYLB\u包括\u安装\u目标}
文件\u权限所有者\u读取组\u读取世界\u读取
目录\权限所有者\读取所有者\执行组\读取组\执行世界\读取世界\执行)
#创建cmake config到lib/cmake/my_libConfig.cmake
安装(导出我的库)
目的地库/cmake
文件my_libConfig.cmake)
这允许您

  • 使用安装目标将文件写入通过或指定的目录
  • 使用cpack创建包,假设为包生成器设置了包的其他信息
  • 命令
    export(export)
    导出项目的生成树。由于不希望移动/复制生成树,因此在这种情况下不要期望可重新定位的导出。您可能希望导出安装树,这可以通过可重新定位的方式完成。使用
    install(EXPORT)
    命令导出安装树。
    set(MYLB_INCLUDE_INSTALL_DESTINATION include/my_lib)
    
    add_library(my_lib ...)
    
    # need to provide location in installation dir and build dir separately here
    target_include_directories(my_lib PUBLIC
        $<BUILD_INTERFACE:include>
        $<INSTALL_INTERFACE:${MYLB_INCLUDE_INSTALL_DESTINATION}>)
    
    install(TARGETS my_lib EXPORT my_lib
        ARCHIVE DESTINATION lib # static and import libs installed to lib
        LIBRARY DESTINATION lib # .so installed to lib
        RUNTIME DESTINATION bin # .dlls installed to bin 
        )
    
    # install directory containing public headers to include/my_lib
    install(DIRECTORY include DESTINATION ${MYLB_INCLUDE_INSTALL_DESTINATION}
        FILE_PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
        DIRECTORY_PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
    
    # create cmake config to lib/cmake/my_libConfig.cmake
    install(EXPORT my_lib
        DESTINATION lib/cmake
        FILE my_libConfig.cmake)