Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.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
C++ 导出(安装)的cmake目标是否可分发?_C++_Cmake_Glfw - Fatal编程技术网

C++ 导出(安装)的cmake目标是否可分发?

C++ 导出(安装)的cmake目标是否可分发?,c++,cmake,glfw,C++,Cmake,Glfw,我正在处理一个有很多外部依赖项的项目,这些依赖项包含在项目树中。我想预先构建所有依赖项,并在项目树中共享可导入的目标 我计划在源代码树中使用带有cmake_install_前缀的cmake install,并使用cmake_PREFIX_路径为find_包引用它。然而,我开始怀疑这个策略的可维护性如何?例如,我在其中一个已安装的cmake脚本中注意到: ${CMAKE_PREFIX_PATH}/lib/CMAKE/glfw3/glfw3目标。CMAKE: set_target_propertie

我正在处理一个有很多外部依赖项的项目,这些依赖项包含在项目树中。我想预先构建所有依赖项,并在项目树中共享可导入的目标

我计划在源代码树中使用带有cmake_install_前缀的cmake install,并使用cmake_PREFIX_路径为find_包引用它。然而,我开始怀疑这个策略的可维护性如何?例如,我在其中一个已安装的cmake脚本中注意到:

${CMAKE_PREFIX_PATH}/lib/CMAKE/glfw3/glfw3目标。CMAKE:

set_target_properties(glfw PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include"
  INTERFACE_LINK_LIBRARIES "/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libm.so;dl;/usr/lib/x86_64-linux-gnu/libX11.so;-lpthread"
)
对我来说,所有这些链接库都完全解析为主机上的路径,这似乎真的很可疑

我想问题是:cmake安装到前缀是否意味着可分发,这只是一个坏例子,还是意味着要绑定到您“安装”它们的机器上?例如,prefix是否真的意味着只是重新定位系统上应该“安装”东西的位置,我希望将其用作共享包管理器可能会有问题?

是的,导出的CMake目标可以是“可分发的”,但项目应该遵循一些原则来实现这一点

如果链接到(外部)库,但不希望导出文件包含指向该库的绝对路径,则不要将绝对路径直接传递到
目标链接库

如果链接库附带编译器(例如
m
rt
),事情很简单:只需将库的名称传递给
目标链接库

如果链接库YYY来自其他包,并被
查找包(YYY)
检测到,这意味着以下几点:

  • 脚本
    FindYYY.cmake
    YYYConfig.cmake
    应返回导入的目标。如果这不是真的,您可以尝试将其结果包装到导入的目标中

  • 目标链接库应使用此导入的目标

  • 项目附带的脚本
    XXXConfig.cmake
    ,应用于在用户计算机上发现库

  • 对于
    find_dependency(YYY)
    work,用户计算机应具有
    FindYYY.cmake
    YYYConfig.cmake
    脚本。或者,您可以随项目一起发布
    FindYYY.cmake
    ,并在
    find_dependency()
    调用(在
    XXXConfig.cmake
    中)之前调整
    cmake\u模块路径
    变量


  • 您不应该通过复制cmake安装的文件并将其发送给其他人来共享这些文件。如果你想制作一个完全可分发的可执行文件,最好的方法仍然是静态链接。如果你想把你的项目打包成最终用户可以使用的东西,请看@Justin,从技术上讲,这是一个由人组成的团队共同开发一个产品。我们没有发布最终用户会使用的API,除非你说我的团队是最终用户。。。在这种情况下,我仍然不想在任何人的机器上“安装”任何东西,而是将所有依赖项作为项目的一部分,以便它们都可以轻松链接(即使它们都是作为“某个程序员”构建的静态库)指出。要么让每个人自己运行cmake,要么强制执行公共系统设置,可能是通过VM。请签出或使用其他包管理器。谢谢。不过,在你的第二段中,我没有这样做。我需要编辑第三方cmake脚本吗?在任何情况下,我都可以认为所有的目标库都是其他目标,并且ot指向libs的路径。“我需要编辑第三方cmake脚本吗?”-不建议这样做。如果第三方脚本
    FindYYY.cmake
    不提供导入的目标,但提供变量,则可以创建导入的(调用
    find_package(YYY)
    )或甚至导入的接口)根据这些变量设置其属性。在调用
    find_dependency(YYY)
    之后,在
    XXXConfig.cmake
    脚本中也应该这样做。不,我的意思是…关于“不要直接传递绝对路径”以链接库为目标。我无法真正控制第三方库在那里做什么。例如:这显示了导致问题中发布绝对路径的cmake。在3d party项目中使用绝对路径意味着该项目的导出目标不可重新定位。您仍然可以拥有自己的包及其导出目标(假设您使用
    find_-package(GLFW)
    find_-dependency(GLFW)
    来查找GLFW库)。问题是几乎所有第三方库都将使用一些find_-package(AAA)来查找系统上的依赖项,以及通用FindAAA脚本(包括在cmake中)创建不可重定位的路径。是否有一个设置来调整它?因为它们的依赖关系是可传递的,所以它创建了一个不可重定位目标的噩梦。