【问题标题】:Alternatives to the --sysroot switch of gcc?gcc 的 --sysroot 开关的替代品?
【发布时间】:2010-06-04 19:30:59
【问题描述】:

当您不希望标准路径中的标头/库影响您的构建时,--sysroot 开关非常有用。

--sysroot=dir: 使用 dir 作为 headers 的逻辑根目录和 图书馆。例如,如果 编译器通常会搜索 /usr/include 和库中的标头 在 /usr/lib 中,它将改为搜索 目录/usr/include 和目录/usr/lib。 [ref]

是否可以通过使用环境变量、gcc 规范 文件或任何其他不需要命令行开关的方法来完成相同的操作?

【问题讨论】:

    标签: gcc path header


    【解决方案1】:

    如果您可以使用环境变量,您可以将 --sysroot 添加到 CFLAGS。

    【讨论】:

      【解决方案2】:

      您可以围绕 gcc 创建一个包装脚本,使用您希望的标志执行实际的 gcc。这适用于 Makefile 和与环境变量混淆的复杂构建。你只需要确保你的 gcc 脚本在 PATH 中比实际的 gcc 二进制文件更早。脚本本身只有两行,

      #!/bin/sh
      exec /usr/bin/gcc --sysroot=/your/sysroot "$@"
      

      如果$HOME/bin在你的PATH早期,你可以把脚本放在$HOME/bin,它不会影响任何其他用户。

      如果您有一个在/usr/bin/ 中明确查找gccconfigure 脚本,您可能需要将/usr/bin/gcc 重命名为/usr/bin/gcc.bin,并将您的脚本命名为/usr/bin/gcc。这将影响所有用户。如果您需要它,但又希望它只影响某些用户或用户,请使用

      #!/bin/sh
      [ "$(id -un)" -eq "theuser" ] && exec /usr/bin/gcc.bin --sysroot=/your/sysroot "$@"
      exec /usr/bin/gcc.bin "$@"
      

      你可以做变体,例如使用相同的方案来设置特定的 sysroot 的特定用户帐户或组成员身份。

      【讨论】:

      • 这是我尝试交叉编译 AXIS2/C 时的唯一解决方案。由于一些神秘的原因,AXIS2/C 的 makefile 只是去掉了我在链接 sharedlib 时放入 CFLAGS、LDFLAGS 和 LIBS 环境变量中的“--sysroot”选项。我也曾尝试使用 ./configure --disable-shared 选项禁用共享,但链接器会在最终链接阶段抱怨“重复符号”错误。
      • @RichardLiu:如果您为 AXIS2/C 1.6.0 运行 util/autogen.sh,它会生成一个新的 --with-sysroot=DIR 配置选项。然而,看起来它只传递给了 libtool。添加--with-cflags-sysroot 配置选项(每个configure.ac 中大约30 行)似乎有效。你想试试那个补丁吗?整个项目似乎过时了,因为它在我的开发机器上尝试编译的第一个文件 (util/src/platforms/unix/uuid_gen_unix.c) 失败..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2013-08-18
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多