gcc的--sysroot开关的替代方案是什么?

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

--sysroot=dir:将dir作为头文件和库的逻辑根目录。例如,如果编译器通常在/usr/include中搜索头文件并在/usr/lib中搜索库,则它将改为搜索dir/usr/include和dir/usr/lib。[ref]

是否可以通过使用环境变量、gcc specs文件或任何其他不需要命令行开关的方法来实现相同的效果?
2个回答

13

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


3

您可以创建一个围绕着gcc的包装脚本,使其使用您想要的标志来执行实际的gcc。这适用于Makefiles和涉及环境变量的复杂构建。您只需要确保您的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
@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)时失败了。 - Nominal Animal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接