【问题标题】:How can I manage the installation directory with CMake when cross-compiling?交叉编译时如何使用CMake管理安装目录?
【发布时间】:2019-10-02 11:46:36
【问题描述】:

我正在使用 CMake 和工具链文件交叉编译 C 库。我的工具链文件将CMAKE_SYSROOT 设置为适当的值,因此编译工作没有问题。但是在安装的时候,库并没有安装到CMAKE_SYSROOT指向的目录。我可以通过运行make install DESTDIR=xxx 来实现这种效果。

我知道这里有两个不同的概念:

  • 交叉编译工具链,由可在我的本地架构上运行的二进制文件组成
  • CMAKE_SYSROOT 是目标架构文件系统的根目录,包含头文件和库,传递给例如gcc 通过--sysroot 标志。

我有两个问题:

  • 将我的交叉编译工具链所在的 sysroot 与将安装我的所有交叉编译库的 sysroot 合并是个好主意吗?我觉得它应该是一样的,但我不确定,对于 CMake 来说,它们似乎是不同的概念。 更新:回答在下面的 cmets 中,这些确实是不同的概念。

  • 像上面描述的那样交叉编译时指定安装目录的现代 CMake 方法是什么? 更新:我认为这应该与CMAKE_SYSROOT 相同,并且我认为 CMake 应该提供一种仅在某处定义一次的方法。

谢谢!

【问题讨论】:

  • 通常,您希望将交叉编译的二进制文件安装到为此目的指定的位置——可能但不一定是交叉目标的文件系统映像。您的交叉工具链由 local-system 二进制文件组成,因此不清楚为什么您认为它们的交叉二进制输出与它们本身属于同一位置。
  • 当然,这是我所缺少的。谢谢。这回答了我的第一个问题。
  • 想一想,我的第二个现在也很清楚了。再次感谢。
  • 对不起,其实第二个子弹还不清楚。我更新了我的问题。

标签: cmake cross-platform


【解决方案1】:

sysroot 和安装目录(前缀)之间没有干扰

Sysroot 由CMAKE_SYSROOT 变量给出,表示构建过程中使用的工具的前缀。

安装目录(前缀)由CMAKE_INSTALL_PREFIX 变量给出,表示安装时将使用项目的路径。例如。带有安装前缀 /usr/local 的项目的可执行文件 foo 期望以 /usr/local/bin/foo 运行。

注意,在默认安装过程中,CMake 会将文件安装到 主机 机器上。要将文件安装到 target 机器上,需要调整此过程。 make install 的参数DESTDIR=xxx 是一种将文件直接安装到目标机器的方法。另一种方法是在 host 上创建一个包(例如使用 CPack),然后将该包安装在 target 机器上。

请注意,在上一段中,交叉编译是否占位是无关:可以在一台机器上构建项目并安装它与另一个类似,但没有任何交叉编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多