【问题标题】:How to deal with dependencies when cross-compiling交叉编译时如何处理依赖关系
【发布时间】:2021-09-02 06:09:53
【问题描述】:

将一个研究项目转移到一家初创公司后,我突然需要分发二进制文件而不是源代码 + 构建指令。我有一个使用 CMake 构建的 C++ 代码库。

我发现自己在这里完全超出了我的深度,以至于我似乎无法找到开始所需的资源。更具体地说,问题是如何交叉编译源代码,以便用户可以从安装依赖库的任何位置加载依赖库(也感谢在这些情况下动态/静态库的优缺点)。现在,当我构建目标时,二进制文件会自动链接到特定于我的主机环境的路径,这当然不适用于分发二进制文件。我正在寻找:

  1. 关于如何使用 CMake 完成此任务的高级描述,
  2. 一些指向资源的指针足以让一个完整的交叉编译新手理解。

编辑:我意识到我实际上有两个问题,而不是一个。其中之一是关于交叉编译,我对实际使用具有不同操作系统的机器(真实或虚拟)为每个操作系统构建感到满意,从而消除了在例如不同操作系统之间进行交叉编译的需要。 Windows 和 Mac。另一个我仍然不知道如何处理的问题是如何在我的机器上构建可执行文件并将其分发到具有相同操作系统的其他机器,因为可执行文件使用动态链接的依赖项,这些依赖项很可能安装在不同的路径,或者是用户机器上的不同版本。如何在我的机器上构建一个二进制文件(可能在 cmake 的 find_package 或类似的帮助下)可以链接到用户在其系统上安装它们的任何依赖项,而无需共享源代码?

【问题讨论】:

  • 静态库绝对让您的生活更轻松您的目标是哪个平台?
  • 2 种方法:(1) 使用交叉编译工具链(如果可用)——我认为这很难。 (2) 使用每个支持的目标平台的虚拟机和每个平台的本地工具链。对于这两种方法(如 Alan 上面所说),使用静态链接使工作变得更加简单。如果您必须使用动态链接,您可能需要安装程序来安装任何缺少的依赖项。
  • 您可能需要考虑使用 cmake 的 install 命令在部署二进制文件的系统上指定文件结构并使用 cpack 生成某种包。根据包裹类型,您可能需要设置其他信息。您可以专门为 lib 的部署版本设置一些属性(例如CMAKE_INSTALL_RPATH)。还有可能生成 cmake 配置文件以使用 find_package 将二进制文件作为导入目标导入目标系统上的 cmake 项目。
  • 我现在主要针对 linux 和 mac。 Windows 也将在未来具有相关性,但在短期内不会。
  • 感谢您的 cmets。我在上面更新了我的问题,非常感谢对我澄清的问题的意见。我可能需要对某些依赖项使用动态库。我会研究 Fabian 的答案,这似乎是我需要的。不过,在 cmake 方面,它目前有点超出我的想象。

标签: c++ cmake cross-compiling libraries


【解决方案1】:

以我的观点,使用 cmake 导入库项目就可以了。

cmake_minimum_required(VERSION 3.0)

project(specific_library)

if(WINDOWS)
    set(imported_lib ${win_lib})
elseif(LINUX)
    set(imported_lib ${linux_lib})
elseif(ANDROID)
    set(imported_lib ${android_lib})
endif(WINDOWS)

add_library(
    ${PROJECT_NAME}
    STATIC
    IMPORTED
    GLOBAL
)

在主项目目录中,你可以这样做

add_subdirectory(specific_library)
target_link_libraries(
    ${PROJECT_NAME}
    PUBLIC
    specific_library
)

【讨论】:

  • WINDOWSLINUX 都不是标准 CMake 变量。
  • 是的,即使你的PROJECT_NAME 也不是specific_library。我试图提供一个想法,而不是一个答案。
  • 但是这是作为答案发布的,而且比仅仅错误更糟糕的是,它具有误导性。代码看起来似是而非,但实际上充其量只是伪代码。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2021-12-14
相关资源
最近更新 更多