GCC交叉编译器在VxWorks上无法编译C++。

3

我正在尝试将一个Linux库移植到VxWorks上运行。我已经成功地构建了binutils和gcc,以便以i486-wrs-vxworks为目标,并且可以成功地构建一个简单的C程序。但是,当我尝试编译C++时,出现了问题。

我有一个简单的Hello World程序:

#include <string>
#include <iostream>
int main()
{
    std::string s = "Hello World";
    std::cout << s << std::endl;
    return 0;
}

构建它时,我调用:
i486-wrs-vxworks-gcc -I/home/kyle/vxworks-6.9/target/usr/h -I/home/kyle/vxworks-6.9/target/usr/h/c++ hello.cpp

这总是会失败,并显示以下消息:

In file included from /home/kyle/vxworks-6.9/target/usr/h/c++/cerrno:4:0,
             from /home/kyle/vxworks-6.9/target/usr/h/c++/xlocnum:4,
             from /home/kyle/vxworks-6.9/target/usr/h/c++/ios:4,
             from /home/kyle/vxworks-6.9/target/usr/h/c++/ostream:4,
             from /home/kyle/vxworks-6.9/target/usr/h/c++/istream:4,
             from /home/kyle/vxworks-6.9/target/usr/h/c++/string:4,
             from hello.cpp:1:
/usr/local/lib/gcc/i486-wrs-vxworks/4.6.4/../../../../i486-wrs-vxworks/include/yvals.h:4:24: fatal error: yvals.h: No such file or directory

如果我查看/usr/local/i486-wrs-vxworks/include/yvals.h文件,我会看到以下内容:

/* yvals.h values header for conforming compilers on various systems */
#if (defined(__cplusplus) && defined(__GNUC__))
/* GCC C++ has it's own yvals.h */
#include_next <yvals.h>
#else /* __cplusplus && __GNUC__ */
#ifndef _YVALS
#define _YVALS
#ifdef _NO_WINDRIVER_MODIFICATIONS
#include <stdarg.h>
#endif
...

看起来需要包含另一个 yvals.h,但我找不到它的位置。是我编译gcc失败了,还是有其他方法可以解决这个问题?


你试过 i486-wrs-vxworks-g++ 吗? - Mats Petersson
/usr/local/i486-wrs-vxworks/include/yvals.h 文件中是否有另一个 yvals.h 的 include - 通常这些系统文件后面会包含另一个文件... 不幸的是,我不知道你问题的答案,所以我只能引导你沿着我调查的路径前进。 - Mats Petersson
/usr/local/i486-wrs-vxworks/include/yvals.h中有一行#include_next <yvals.h>,这表明应该还有另一个yvals.h文件...不幸的是,据我所知,它实际上并不存在。运行find / -name yvals.h只返回我已经知道的yvals.h文件。 - kylem
那么,它出错的是“yvals.h” - 我不确定它应该包含什么。只是作为一种hack方法,您是否尝试过注释掉那行#include_next yvals的代码? - Mats Petersson
yvals.h 看起来像是 yacc 的输出,需要在构建系统中查找 .y 文件和 yacc 调用。 - Dmytro Sirenko
显示剩余3条评论
2个回答

1
你们使用的是哪个版本的VxWorks?
我模糊地记得,在过去升级VxWorks版本时,yvals.h文件中有一个语法错误,我需要解决它,而且在后续版本中已经修复了该问题。
此外,你可以从WindRiver预构建的gcc交叉编译器中获取。只需使用你的许可证号码登录windriver.com/support,并前往“下载”以获取你的产品版本。

0
我最近也经历了一场交叉编译的噩梦(与VxWorks无关),只不过我遇到的问题是在使用stddef.h时出现了困难。问题最终被证明是我需要指定系统头文件的包含路径。
以下是我解决错误信息所需的步骤。如有必要,请随意修改。
创建一个名为foo.c的文件。
#include <stddef.h>   /* The problem header file (yvals.h for you?) */

int main (void) {
    return 0;
}

使用您选择的编译器进行编译

$(CC) foo.c -E

请注意它使用的包含路径,并将它们设置为您的系统头文件列表,使用以下命令:
-isystem <include path>

选项。

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接