什么是Qt的sysroot和前缀选项的实际例子

时间:2014-03-20 17:06:04

标签: linux qt embedded qt5 configure

我正在查看可以为Qt提供的configure脚本运行的所有选项。 (特别是qt-everywhere-opensource-src-5.2.0)。

经过相当多的搜索,我确定这些东西最好记录在案,所以我希望能得到一些帮助。当我查看prefixsysroot配置选项的说明时:

  

〜/ qt-everywhere-opensource-src-5.2.0 $ ./configure -help | grep" sysroot"
      -extprefix <dir> ...使用-sysroot时,将所有内容安装到<dir>
      -sysroot <dir> ......将<dir>设置为目标编译器和qmake的sysroot,并设置pkg-config路径。
      -no-gcc-sysroot .....当使用-sysroot时,它禁止将--sysroot传递给编译器

  〜/ qt-everywhere-opensource-src-5.2.0 $ ./configure -help | grep&#34;前缀&#34;
      -prefix <dir> ......这将安装与<dir>相关的所有内容       -extprefix <dir> ...使用-sysroot时,将所有内容安装到<dir>
      -hostprefix [dir] ..开发时需要的工具和库

所以我之前使用过-prefix,并且完全如上所述。它将所有内容放在提供的<dir>上,然后当我使用<prefix_dir>/bin/qmake构建我的应用程序并将其安装在我的目标平台上时,它希望在<prefix_dir>/lib找到所有共享对象库。

我的印象是,如果我使用-sysroot,它会在<sysroot_dir>安装所有内容,然后当我在目标平台上安装我的应用程序时,它将在/lib中搜索。至少我希望这是真的。

现在,如果我的假设是正确的......那么-extprefix的重点是什么?他们是否说如果我同时使用-sysroot-extprefix,我可以重定向好的地方?

我想要使用-no-gcc-sysroot的原因是什么?如果我希望我的Qt库安装在&#34; sysroot&#34;为什么我不希望gcc使用/知道相同的sysroot?

如果能得到一些如何正确使用这些选项的实际例子,对其中一些的解释会很好,甚至更好。

2 个答案:

答案 0 :(得分:12)

这些是构建嵌入式平台时使用的选项。 是的他们是皇家一塌糊涂。所以这里只是部分答案:

- 前缀

  • 尝试并证明使用/ usr / lib而不是/ usr / local / lib或类似的方式来完成Qt的整个安装
  • 当Qt是为当前正在运行的平台构建的(典型的桌面版)

-sysroot / path

  • 打算为未安装在/
  • 的系统构建Qt
  • 例如-sysroot~ / mysystem~ / myssytem包含 / lib / bin等......
  • 会将--sysroot传递给其他工具,比如gcc和pkg-config,所以他们会在〜/ mysystem / lib而不是/ lib
  • 中搜索它们的依赖项

-extprefix / b

  • 使用-sysroot / a时,实际上不写入/ a
  • 将qt写入/ b而不是
  • 这适用于对只读sysroots进行交叉编译

-no-GCC-SYSROOT

  • 对于无法在-sysroot中找到自己的crt的编译器非常具体的攻击
  • 将sysroot传递给pkgconfig和其他人,但不传递给gcc
  • 这样可以使用-L / sysroot / lib /正确调用gcc,但不会尝试在此处找到隐式路径(crt)。

-hostprefix / path

  • 在编译与我们当前正在运行的目标不同的目标时
  • qmake将是主机架构(例如x86),qt本身将成为目标架构(让我们说臂)
  • 所以将qmake放在/ path而不是-sysroot指定的目标系统中。它对目标系统没有任何用处

增加混乱:

-R / path

  • 设置链接器运行路径 - 这是QtGui找到QtCore的地方 - 独立于所有其他选项

在为目标而不是主机编译时要使用哪些标志,取决于configure中的大量硬编码假设。

一般来说-sysroot plus -prefix应该适用于大多数用例。

即。当你有:

 $ ls ~/mytarget
 lib bin share dev

你可以使用-sysroot~ / mytarget -prefix /

答案 1 :(得分:2)

一个实际的例子是为Raspberry Pi交叉编译Qt,然后创建一个&#34;姐妹&#34;套件添加到Qt Creator。

以下命令在安装Pi的根文件系统后在Pi上安装Qt:

    ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$RPI_TOOLCHAIN -sysroot $RPI_SYSROOT -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -prefix /usr/local/qt-5.5.1-pi -skip qtwebkit

然后,以下命令使用Pi的根文件系统在桌面上安装二进制文件。

    ./configure -opengl es2 -device linux-rasp-pi-g++ -device-option CROSS_COMPILE=$RPI_TOOLCHAIN -sysroot $RPI_SYSROOT -opensource -confirm-license -optimized-qmake -reduce-exports -release -make libs -extprefix /usr/local/qt-5.5.1-pi -skip qtwebkit

请注意,唯一的区别是使用-extprefix而不是-prefix来指导安装位置。

注意您可以通过在同一行中同时指定前缀和扩展名来同时在主机和目标上安装Qt

现在,您可以通过指定qmake路径,设备,编译器,调试器和sysroot将此工具包添加到Qt Creator。因此,您可以在桌面上创建qt项目,然后根据您选择的工具包在桌面或pi上构建和运行。