从源文件构建gcc时,如何确定正确的头文件(libstdc ++-v3构建)

时间:2019-02-15 23:32:45

标签: c++ gcc libstdc++

我是从源文件构建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。

想法?

谢谢你, 凯文

1 个答案:

答案 0 :(得分:1)

目的是C ++编译器可以使用C编译器提供的系统math.h文件。但是,似乎math.h本身在std名称空间中有一些C ++样式的位(基于// OVERLOADS注释),并且混淆了libstdc ++的实现。

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

考虑到这些问题,我希望将需要更多的移植工作。