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

凯文斯塔拉德

我是从源文件构建 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" 时,数学。包含的 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。

想法?

谢谢你,凯文

弗洛里安·韦默

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

您需要查看您的副本math.h定义了什么也许有一个预处理器选项可以用来禁用这些 C++ 定义。然后你可以在#include_next指令之前设置它或者因为你的math.h头显然是C ++ -已经启用,有可能要删除的定义abs,并modf从功能libstdc++-v3/include/c/cmath

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章