Я пытаюсь портировать библиотеку Linux для запуска на VxWorks. Я успешно построил binutils и gcc для цели i486-WRS-VxWorks и я могу успешно построить простую программу на Си. Тем не менее, когда я пытаюсь скомпилировать 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, или есть способ это исправить?
Какую версию VxWorks вы используете для этого?
У меня есть нечеткое воспоминание о том, что при обновлении версий VxWorks в прошлом была ошибка синтаксиса в yvals.h, которая была мне необходима для обхода, и это было исправлено в следующей версии.
Также вы можете получить кросс-компилятор gcc, предварительно собранный из WindRiver. Просто войдите на windriver.com/support с вашим номером лицензии и перейдите в раздел «Загрузки» для версии вашего продукта.
Я сам пережил недавний кошмар кросс-компиляции (не связанный с VxWorks), за исключением того, что вместо yvals.h у меня было горе от 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>
вариант.
Надеюсь это поможет.