如何覆盖 GCC 的配置以进行包含搜索?
Posted
技术标签:
【中文标题】如何覆盖 GCC 的配置以进行包含搜索?【英文标题】:How do I override GCC's configuration for include searching? 【发布时间】:2013-04-16 23:15:30 【问题描述】:环境:
Ubuntu,GCC 4.6.3 使用 Qt 4.8
默认情况下,我的包含搜索顺序(由 gcc -v 报告)是:
<clipped out my project specific includes>
/usr/include/c++/4.6
/usr/include/c++/4.6/x86_64-linux-gnu/.
/usr/include/c++/4.6/backward
/usr/lib/gcc/x86_64-linux-gnu/4.6/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
我正在尝试存档此构建环境,以便它不会从实际的系统文件夹构建,而只能从重新创建我的机器时签入和明确定义的源树构建。我遇到了覆盖 gcc 的系统搜索路径的问题。
具体来说,我首先尝试了--sysroot=../../sysroot,但只有最后两个包含文件夹改变了:
/usr/include/c++/4.6
/usr/include/c++/4.6/x86_64-linux-gnu/.
/usr/include/c++/4.6/backward
/usr/lib/gcc/x86_64-linux-gnu/4.6/include
/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
../../sysroot/usr/include/x86_64-linux-gnu
../../sysroot/usr/include
GCC -v 报告:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v
--with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5'
--with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.6
--enable-shared --enable-linker-build-id --with-system-zlib
--libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib
--enable-nls
--with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin
--enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
看来 /usr/lib/... 和 /usr/include... 行可能来自内置的 GCC 配置。我是 GCC/G++ 菜鸟,所以我在这里可能是错的 - 请酌情更正。
无论如何,我的问题是如何更改我的配置,以便这些文件夹:
/usr/include/c++/4.6
/usr/include/c++/4.6/x86_64-linux-gnu/.
/usr/include/c++/4.6/backward
/usr/lib/gcc/x86_64-linux-gnu/4.6/include
/usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
也与 ../../sysroot 相关?
(需要明确的是,我知道 -I 并且这些没有在命令行或 make 文件中指定。)
我可以几乎通过使用 -nostdinc 并直接指定每个文件夹(使用 -I)来获得正确的结果,除了 Qt Meta-Object-Compiler 在输入其中一些系统时失败,包括文件夹。因为我使用的是 Qt,所以我想更改 GCC 的配置搜索路径,而不是仅使用 -I 单独列出每个系统文件夹。
任何建议将不胜感激。
谢谢, 布拉德
【问题讨论】:
【参考方案1】:正如可能的解决方案之一,对于您的情况来说可能太多了:
实际上,据我了解,您要实现的目标接近于针对不同系统映像的交叉编译。这个任务在嵌入式开发中很常见,虽然它不是那么容易。大多数想法是构建 GCC,以便它“认为”系统映像与正常情况不同。
This link 至少应该可以帮助您理解基本原理。 This is another 并且还包含其他有用的链接,例如交叉编译常见问题解答。
【讨论】:
本质上,是的,我想交叉编译(对于嵌入式是),但我不想重建编译器。为每个环境重新构建一个单独的编译器似乎是不必要的浪费。也许我很傻,但我希望我需要设置的只是配置数据。 @BitBitz 在电信行业 20 多年后,我建议重建。 :-) 你不应该经常切换这样的环境,在你这样做一次或几次之后,你会更容易。但它可以为您节省很多未来的时间,特别是如果您在团队之间分发此解决方案。 使用了交叉编译的 gcc。 还有另一种可能性,只需使用需要相同结果的人的结果。但是下次您无法收到“准备好的”解决方案:-)。以上是关于如何覆盖 GCC 的配置以进行包含搜索?的主要内容,如果未能解决你的问题,请参考以下文章
如何知道 PDF 是不是仅包含图像或已被 OCR 扫描以进行搜索?