【问题标题】:How do I determine the correct header files when building gcc from source files (libstdc++-v3 build)从源文件构建 gcc 时如何确定正确的头文件(libstdc++-v3 build)
【发布时间】:2019-07-10 03:09:21
【问题描述】:

我是从源文件构建 gcc 的新手。我正在为 QNX 构建一个交叉编译器版本。

过程的一部分是使用有关 QNX 版本的信息和一些路径信息来修改 build_hooks。

我正在构建 libstdc++-v3 的过程中。交叉编译器构建良好,它被用于构建 libstdc++ 源代码。

它运行良好,直到它开始包含头文件,例如 math.h。具体来说,它正在构建 complex_io.c。它包括 cmath,它执行 #include_next "math.h"

此时出现一些函数重定义错误,例如:

In file included from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/complex:44,
                 from ../../../../../libstdc++-v3/src/c++98/complex_io.cc:25:
/home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/cmath:80:3: error: redefinition of 'double std::abs(double)'
   abs(double __x)
   ^~~
In file included from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/cmath:36,
                 from /home/parallels/qnx-core-dev-tools/core-dev-tools/tools/gcc/branches/gcc_8_2_branch/linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/complex:44,
                 from ../../../../../libstdc++-v3/src/c++98/complex_io.cc:25:
/opt/qnx660/target/qnx6/usr/include/math.h:720:15: note: 'double std::abs(double)' previously defined here
 inline double abs(double _Left) // OVERLOADS
               ^~~

交叉编译器的构建导致 QNX (/opt/qnx660/target/qnx6/usr/include) 头文件的基本安装的包含搜索路径,因此当 cmath 执行 #include_next "math.h" 时,包含的 math.h 来自此目录路径。

我想了解的是 libstdc++-v3 的源代码树中正确的 math.h 在哪里?有几个可供选择,我至今未能选择正确的一个。

./fixincludes/tests/base/ansi/math.h
./fixincludes/tests/base/architecture/ppc/math.h
./fixincludes/tests/base/math.h
./libstdc++-v3/include/tr1/math.h
./libstdc++-v3/include/c_compatibility/math.h
./linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/libstdc++-v3/include/tr1/math.h
./linux-x86-o-ntox86/i486-pc-nto-qnx6.6.0/pic/libstdc++-v3/include/tr1/math.h

即使我知道哪个是正确的,我也不确定如何配置构建以便它选择正确的 math.h 而不必破解任何自动生成的 Makefile。

想法?

谢谢你, 凯文

【问题讨论】:

  • 它通常是系统 libc 提供的头文件,而不是编译器。
  • @Shawn 我想知道这一点。我不知道 libstdc++-v3 的构建是否包含在 gcc 的代码包中(例如,所有文件都存在,包括头文件),或者是否存在对源包的一些依赖项,这些依赖项预计会在系统上进行构建。
  • gcc 有一个邮件列表,我认为有人会更有可能找到有经验的 gcc 开发人员,他们可能会提供一些有用的帮助。
  • 啊,好主意,我会这样做,谢谢@SamVarshavchik
  • 我刚刚编译了一个交叉编译器(avr-gcc),一开始我遇到了一些困难。问题是我已经有了旧版本的 avr-gcc 和环境变量。我将旧版本移动到不同的位置,并非常仔细地阅读了 gcc 文档gcc.gnu.org/install/configure.html,它编译正确。

标签: c++ gcc libstdc++


【解决方案1】:

其目的是 C++ 编译器可以使用由 C 编译器提供(或与 C 编译器一起使用)的系统 math.h 文件。但是,math.h 本身似乎在 std 命名空间中有一些 C++ 风格的位(基于 // OVERLOADS 注释),这会混淆 libstdc++ 实现。

您需要查看math.h 的副本定义的内容。也许有一个预处理器选项可以用来禁用这些 C++ 定义。然后你可以在#include_next 指令之前设置它。或者由于您的 math.h 标头显然已经启用了 C++,因此可以从 libstdc++-v3/include/c/cmath 中删除 absmodf 函数的定义。

考虑到这些问题,我预计需要更多的移植工作。

【讨论】:

  • 谢谢弗洛里安。旧 qnx gcc(我认为是 4.7.2)中的 cmath 包含文件实际上与 8.2 gcc 版本中的 cmath 相同。所以我认为预处理器指令需要排序。
  • 我下载的 GCC 的 8.2 版本(针对 QNX 平台进行了修改)也缺少 libstdc++-v3/include/c 文件夹中的头文件。当我用必要的头文件更新该文件夹时,它毫无怨言地构建了。您对构建过程的工作原理以及通常使用的头文件的说明对正确定位我的想法非常有帮助。谢谢。
  • QNX 使用的libstdc++-v3/include/c 标头几乎可以肯定已经比特腐烂了。我对libstdc++-v3/include/c_global 标头进行了数十次更改,但没有对c 进行相应更改(因为我不知道是否有人关心或仍在使用它们)。请报告错误,以便我更新c 的:gcc.gnu.org/bugs
猜你喜欢
  • 2013-05-20
  • 2017-07-08
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2015-09-07
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多