交叉编译时如何使用CMake管理安装目录?

时间:2019-10-02 11:46:36

标签: cmake cross-platform

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

我了解这里有两个单独的概念:

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

我有两个问题:

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

请注意,在上一段中,交叉编译是否已发生无关紧要:可以在一台机器上构建项目并安装到另一个,但类似的一个,没有任何交叉编译。