Странное поведение для файлов X.cpp / X.hpp в Integrity - PullRequest
2 голосов
/ 15 сентября 2010

У меня есть проект, который отлично компилируется с gcc, но не компилируется в среде Greenhills Integrity.

Проблема сводится к этим трем файлам:

MyVector.cpp // contains function testVector
MyVector.hpp // contains template vector<>
SomeFile.cpp

MyVector.hpp содержит шаблон-класс для вектора, а MyVector.cpp содержит функцию тестирования, не связанную с шаблонами MyVector.hpp.

Теперь, когда я использую MyVector.hpp vector шаблоны в SomeFile.cpp, каким-то образом функция testVector вводится в SomeFile.cpp. Когда я перестаю использовать vector в SomeFile.cpp (я все еще #include, конечно, я просто не создаю там шаблон), он работает отлично.

Более того, когда я вводил предупреждение в функцию testVector, компилятор отображал предупреждение , когда я компилировал SomeFile.cpp!

Более того, система сборки перекомпилирует SomeFile.cpp, когда я что-то изменяю в MyVector.cpp.

Когда я удаляю функцию testVector из MyVector.cpp и перемещаю ее в новый NewFile.cpp - он компилируется.

Нет, я не включил файл cpp по ошибке, честно, я дважды проверил его и grep отредактировал весь свой исходный код.

Понятия не имею, что происходит. Я буду рад любой подсказке.

Ответы [ 3 ]

2 голосов
/ 06 сентября 2012

Green Hills использует интерфейс Edison Design Group, и до недавнего времени (скажем, MULTI 5.0 или, может быть, даже 5.2) компилятор включал --implicit_include по умолчанию. Вот документация Edison для этой опции:

--implicit_include
--no_implicit_include
-B
     Enable or disable implicit inclusion of source files as a method of
     finding definitions of template entities to be instantiated. -B is
     equivalent to --implicit_include. The default behavior is specified
     by the configuration flag DEFAULT_IMPLICIT_TEMPLATE_INCLUSION_MODE.
     See the section of this chapter on template instantiation. This
     option is valid only in C++ mode.

Ваша проблема, скорее всего, будет исправлена, если вы введете --no_implicit_include в командной строке компилятора. (Если это не помогло, попробуйте -W0,--no_implicit_include или :compiler.args=--no_implicit_include, любой из которых передаст опцию напрямую во внешний интерфейс без (значительной) цензуры со стороны водителя. Передача --std или --STD также может помочь; не помню.)

Сегодня неявное включение - ужасно глупая идея, но это был удобный способ обеспечить функциональность шаблонов еще в 90-х годах. Сегодня существуют стандартные и хорошо известные способы удовлетворения Единого правила определения , и этот хак "неявного включения" просто мешает законопослушным тизенцам C ++, таким как вы.

А теперь продолжайте, спросите меня о предварительной ссылке ...:)

0 голосов
/ 12 апреля 2011

Когда вы говорите, что «вводите предупреждение», вы используете директиву #pragma?Директива #pragma предназначена для просмотра во время компиляции, а не во время выполнения.

Когда вы говорите, что функция testVector вводится в SomeFile.cpp, как это наблюдается?Вы получаете сообщение об ошибке компилятора или компоновщика о том, что функция была ранее определена?

Компилируете ли вы gcc для ОС Integrity или gcc для x86 Linux?
Целостность работает совсем не так, как в Linux, и тип целостностиПроект имеет значение.Вы можете собрать монолитное ядро ​​Integrity или ядро ​​Integrity, поддерживающее динамическую загрузку.Кроме того, библиотеки времени выполнения Integrity C и C ++ отличаются от библиотек Linux.

0 голосов
/ 15 сентября 2010

Как вы реализуете вектор?Я думаю, что вы реализуете это в MyVector.cpp и включаете MyVector.cpp в конце MyVector.hpp.Если это так, то включение MyVector.hpp в SomeFile.cpp приведет к перестроению SomeFile.cpp при изменении MyVector.cpp.Я бы предложил запустить его через препроцессор и посмотреть, откуда включается testVector ().

...