获取“默认”C++ 包含基本路径的惯用方法是什么?

获取“默认”C++ 包含基本路径的惯用方法是什么?

我正在为某个实用程序构建命令行,出于某种原因,该实用程序需要 C++ 包含根目录,例如/usr/include/c++/10(对于 GCC-10 的 libstdc++)。我的问题是:如何在我的系统上确定该路径是什么?或者说,这样做的惯用方法是什么?

显然,可以使用 进行覆盖CPLUS_INCLUDE_PATH,但这种情况很简单。当安装了多个 C++ 编译器(包括多个版本的 GCC)时,我应该怎么办? “手动”对/usr/include?下的版本号进行排序还有别的事吗?

答案1

好问题。

在我的机器上,我得到这个:

$ find /usr/include -name string
/usr/include/c++/8/debug/string
/usr/include/c++/8/experimental/string
/usr/include/c++/8/string
/usr/include/c++/9/debug/string
/usr/include/c++/9/experimental/string
/usr/include/c++/9/string
/usr/include/c++/10/debug/string
/usr/include/c++/10/experimental/string
/usr/include/c++/10/string
/usr/include/c++/11/debug/string
/usr/include/c++/11/experimental/string
/usr/include/c++/11/string
/usr/include/c++/12/debug/string
/usr/include/c++/12/experimental/string
/usr/include/c++/12/string

要找出正在使用的程序,我们可以使用 gcc 处理一个空程序并打印出其搜索路径:

$ g++ -E -xc++ - -v < /dev/null
...
#include <...> search starts here:
 /usr/include/c++/12
 /usr/include/x86_64-linux-gnu/c++/12
 /usr/include/c++/12/backward
 /usr/lib/gcc/x86_64-linux-gnu/12/include
 /usr/include/x86_64-linux-gnu
 /usr/include
...

标志的解释:

  • -E:仅预处理;不要编译、汇编或链接。
  • -xc++:指定语言(C++)
  • -:从标准输入而不是文件中获取输入
  • -v:显示编译器调用的程序。
  • < /dev/null:将空值发送到标准输入。

最好还添加原始 makefile 中的CFLAGSCPPFLAGS并解析编译的输出。这是因为您的 makefile 可以使用-I....

例子:

$ g++ -E -xc++ - -v -I/tmp < /dev/null
...
#include <...> search starts here:
 /tmp                                 <-- NEW because of -I/tmp
 /usr/include/c++/12
 /usr/include/x86_64-linux-gnu/c++/12
 /usr/include/c++/12/backward
 /usr/lib/gcc/x86_64-linux-gnu/12/include
 /usr/include/x86_64-linux-gnu
 /usr/include
...

相关内容