-sysroot 在编译时的作用

本文详细解释了在编译时使用sysroot和prefix参数的原理和影响,通过实例展示了如何正确配置系统目录和安装路径。

如果在编译时指定了-sysroot就是为编译时指定了逻辑目录。编译过程中需要引用的库,头文件,如果要到/usr/include目录下去找的情况下,则会在前面加上逻辑目录。

如此处我们指定 -sysroot=/home/shell.albert/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root

则如果在编译过程中需要找stdio.h,则会用/usr/include/目录下去找,因为我们指定了系统目录,则会到下面的路径去找。

shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include> pwd
/home/shell.albert/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include
shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include> ls -l stdio.h
-r--r--r-- 1 shell.albert users 31052 Jul 24  2010 stdio.h
shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include>

当然,如果我们同时指定了--prefix=/home/shell.albert/libqt5.3.2希望生成的库和头文件等都安装到此目录下,执行make install开始复制操作。

但是当我们去系统的/home/shell.albert/libqt5.3.2中去寻找编译成果时却没有这些文件,

而直接的成果输出在了,输出路径是相对于-sysroot的。

shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/home/shell.albert/libqt5.3.2> pwd
/home/shell.albert/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/home/shell.albert/libqt5.3.2
shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/home/shell.albert/libqt5.3.2> ls
bin  doc  imports  include  lib  phrasebooks  plugins  qml  translations
shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/home/shell.albert/libqt5.3.2> ls lib
cmake                              libQt5Designer.so.5.3.2           libQt5Positioning.so.5       libQt5Sql.so.5.3
fonts                              libQt5Gui.la                      libQt5Positioning.so.5.3     libQt5Sql.so.5.3.2
libQt5Bluetooth.la                 libQt5Gui.prl                     libQt5Positioning.so.5.3.2   libQt5Svg.la
libQt5Bluetooth.prl                libQt5Gui.so                      libQt5PrintSupport.la        libQt5Svg.prl
libQt5Bluetooth.so                 libQt5Gui.so.5                    libQt5PrintSupport.prl       libQt5Svg.so
libQt5Bluetooth.so.5               libQt5Gui.so.5.3                  libQt5PrintSupport.so        libQt5Svg.so.5
libQt5Bluetooth.so.5.3             libQt5Gui.so.5.3.2                libQt5PrintSupport.so.5      libQt5Svg.so.5.3
libQt5Bluetooth.so.5.3.2           libQt5Help.la                     libQt5PrintSupport.so.5.3    libQt5Svg.so.5.3.2
libQt5CLucene.la                   libQt5Help.prl                    libQt5PrintSupport.so.5.3.2  libQt5Test.la
libQt5CLucene.prl                  libQt5Help.so                     libQt5Qml.la                 libQt5Test.prl
libQt5CLucene.so                   libQt5Help.so.5                   libQt5Qml.prl                libQt5Test.so
libQt5CLucene.so.5                 libQt5Help.so.5.3                 libQt5Qml.so                 libQt5Test.so.5
libQt5CLucene.so.5.3               libQt5Help.so.5.3.2               libQt5Qml.so.5               libQt5Test.so.5.3
libQt5CLucene.so.5.3.2             libQt5Multimedia.la               libQt5Qml.so.5.3             libQt5Test.so.5.3.2
libQt5Concurrent.la                libQt5Multimedia.prl              libQt5Qml.so.5.3.2           libQt5UiTools.a
libQt5Concurrent.prl               libQt5Multimedia.so               libQt5Script.la              libQt5UiTools.la
libQt5Concurrent.so                libQt5Multimedia.so.5             libQt5Script.prl             libQt5UiTools.prl
libQt5Concurrent.so.5              libQt5Multimedia.so.5.3           libQt5Script.so              libQt5WebSockets.la
libQt5Concurrent.so.5.3            libQt5Multimedia.so.5.3.2         libQt5Script.so.5            libQt5WebSockets.prl
libQt5Concurrent.so.5.3.2          libQt5MultimediaWidgets.la        libQt5Script.so.5.3          libQt5WebSockets.so
libQt5Core.la                      libQt5MultimediaWidgets.prl       libQt5Script.so.5.3.2        libQt5WebSockets.so.5
libQt5Core.prl                     libQt5MultimediaWidgets.so        libQt5ScriptTools.la         libQt5WebSockets.so.5.3
libQt5Core.so                      libQt5MultimediaWidgets.so.5      libQt5ScriptTools.prl        libQt5WebSockets.so.5.3.2
libQt5Core.so.5                    libQt5MultimediaWidgets.so.5.3    libQt5ScriptTools.so         libQt5Widgets.la
libQt5Core.so.5.3                  libQt5MultimediaWidgets.so.5.3.2  libQt5ScriptTools.so.5       libQt5Widgets.prl
libQt5Core.so.5.3.2                libQt5Network.la                  libQt5ScriptTools.so.5.3     libQt5Widgets.so
libQt5Declarative.la               libQt5Network.prl                 libQt5ScriptTools.so.5.3.2   libQt5Widgets.so.5
libQt5Declarative.prl              libQt5Network.so                  libQt5Sensors.la             libQt5Widgets.so.5.3
libQt5Declarative.so               libQt5Network.so.5                libQt5Sensors.prl            libQt5Widgets.so.5.3.2
libQt5Declarative.so.5             libQt5Network.so.5.3              libQt5Sensors.so             libQt5Xml.la
libQt5Declarative.so.5.3           libQt5Network.so.5.3.2            libQt5Sensors.so.5           libQt5XmlPatterns.la
libQt5Declarative.so.5.3.2         libQt5Nfc.la                      libQt5Sensors.so.5.3         libQt5XmlPatterns.prl
libQt5DesignerComponents.la        libQt5Nfc.prl                     libQt5Sensors.so.5.3.2       libQt5XmlPatterns.so
libQt5DesignerComponents.prl       libQt5Nfc.so                      libQt5SerialPort.la          libQt5XmlPatterns.so.5
libQt5DesignerComponents.so        libQt5Nfc.so.5                    libQt5SerialPort.prl         libQt5XmlPatterns.so.5.3
libQt5DesignerComponents.so.5      libQt5Nfc.so.5.3                  libQt5SerialPort.so          libQt5XmlPatterns.so.5.3.2
libQt5DesignerComponents.so.5.3    libQt5Nfc.so.5.3.2                libQt5SerialPort.so.5        libQt5Xml.prl
libQt5DesignerComponents.so.5.3.2  libQt5PlatformSupport.a           libQt5SerialPort.so.5.3      libQt5Xml.so
libQt5Designer.la                  libQt5PlatformSupport.la          libQt5SerialPort.so.5.3.2    libQt5Xml.so.5
libQt5Designer.prl                 libQt5PlatformSupport.prl         libQt5Sql.la                 libQt5Xml.so.5.3
libQt5Designer.so                  libQt5Positioning.la              libQt5Sql.prl                libQt5Xml.so.5.3.2
libQt5Designer.so.5                libQt5Positioning.prl             libQt5Sql.so                 pkgconfig
libQt5Designer.so.5.3              libQt5Positioning.so              libQt5Sql.so.5
shell.albert@yantai:~/tools/toolschain_arm/4.4.3/arm-none-linux-gnueabi/sys-root/home/shell.albert/libqt5.3.2>


你遇到的这个报错: ``` /usr/bin/as: unrecognized option '--sysroot=/srv/.../sysroot' ``` 说明 **`--sysroot` 选项被错误地传递给了 GNU `as` 汇编器**,而 `as` 并不支持 `--sysroot` 这个参数。 --- ## 🔍 报错原因分析 ### 1. **`--sysroot` 是 GCC/Clang 的选项,不是汇编器的选项** - `--sysroot` 是编译器(如 `gcc`、`clang`)用于指定 sysroot 的参数。 - GNU `as`(即 `/usr/bin/as`)**并不支持 `--sysroot`**,它只是用来汇编 `.s` 文件,不处理 sysroot 路径。 ### 2. **CMake 错误地将 `--sysroot` 应用到了汇编命令中** - 当你设置了 `CMAKE_SYSROOT`,CMake 会将 `--sysroot` 传递给所有语言的编译器(包括 C、C++、ASM)。 - 但在汇编阶段,它错误地将 `--sysroot` 传给了 `as`,导致报错。 --- ## ✅ 正确做法:避免将 `--sysroot` 传给汇编器 你需要 **告诉 CMake 不要把 `--sysroot` 传给 ASM 编译器**。 ### ✅ 解决方案 1:为 ASM 单独设置编译器标志 ```cmake # 设置 C/C++ 编译器使用 sysroot set(CMAKE_C_COMPILER_TARGET "aarch64-linux-ohos") set(CMAKE_C_COMPILER /opt/llvm/bin/clang) set(CMAKE_SYSROOT /opt/ohos-sdk/sysroot) # 设置 ASM 编译器为 clang,并禁用 sysroot 参数 set(CMAKE_ASM_COMPILER /opt/llvm/bin/clang) set_property(GLOBAL PROPERTY ASM_DIALECT "") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} --target=aarch64-linux-ohos") ``` 这样,`C/C++` 编译时会加 `--sysroot`,但 `ASM` 编译时不会。 --- ### ✅ 解决方案 2:通过 `CMAKE_ASM_COMPILE_OBJECT` 控制汇编命令格式 你可以手动设置汇编命令格式,避免加入 `--sysroot`: ```cmake set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <INCLUDES> <FLAGS> -c <SOURCE> -o <OBJECT>") ``` 这会覆盖默认的汇编命令模板,去掉 `--sysroot` 参数。 --- ### ✅ 解决方案 3:使用 `clang` 作为汇编器而不是 `as` GNU `as` 不支持 `--sysroot`,但 `clang` 支持。如果你使用 `clang` 来汇编 `.s` 文件,就不会出错。 ```cmake set(CMAKE_ASM_COMPILER /opt/llvm/bin/clang) set(CMAKE_ASM_COMPILER_TARGET aarch64-linux-ohos) set(CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN /opt/ohos-sdk/sysroot) ``` 此时,`clang` 会处理 `.s` 文件,并且能正确识别 `--sysroot`。 --- ## 📌 总结 | 问题 | 原因 | 解决方案 | |------|------|----------| | `as: unrecognized option '--sysroot'` | `--sysroot` 被错误地传给了 `as` | 改用 `clang` 汇编 `.s` 文件 | | 想使用 sysroot,但 ASM 报错 | CMake 默认将 sysroot 用于所有语言 | 单独配置 ASM 编译器或修改命令模板 | --- ### 相关问题:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值