2012-01-17 2 views
0

Я создаю проект совместного объекта в «IBM Rational Rhapsody 7.5» с qcc, который, в свою очередь, использует gcc.Распределение общих объектов из-за директивы препроцессора

Бинарное несоответствие является наблюдаемым, когда один и тот же код построен на двух разных машинах, имеющих точно такую ​​же среду сборки.

После некоторых методов проб и ошибок я заметил, что несоответствие связано с директивой pre-processsor, используемой для условного выполнения кода (с использованием #ifdef). Когда директива предварительного процессора удалена и проект построен на разных машины. Оба двоичных файла точно совпадают.

Есть ли какие-либо причины для «Почему это несоответствие происходит?».

Является ли предпроцессорной директивой, зависящей от параметров машины в объектном файле, и поэтому они отражаются в исполняемом файле, что дает несоответствие? Прошу вас, пожалуйста.

+1

Какой код находится внутри блока '# ifdef'? Невозможно сказать, в чем проблема, не зная об этом. – Mat

+1

Каким символом является директивный тест? – Bingo

+0

Должна быть какая-то разница между двумя средами, возможно, с типом процессора, версией ОС, версией ядра, версией компилятора или чем-то еще. Вы должны внимательно его проверить. – ciphor

ответ

0

Директива препроцессора #ifdef. Условный сбор. Независимо от того, приводит ли это к двоичной несовместимости, зависит от того, что находится между #ifdef и соответствующим #endif. Например, следующий, очевидно, не имеют никакого влияния на все:

#ifdef FOO 
#endif 

Независимо от того, определяется ли FOO, скомпилированный код выглядит точно так же.

Однако следующее, безусловно, вызывает несовместимость:

#ifdef HAS_FOO_STRUCT 
typedef foo foo_type; 
#else 
struct foo_type {}; 
#endif 

void bar(foo_type); 

Здесь, если HAS_FOO_STRUCT определена, bar(foo_type)bar(foo) на самом деле и будет искажено как таковой. С другой стороны, если HAS_FOO_STRUCT не определен, foo_type действительно является типом этого имени, таким образом, bar(foo_type) будет иметь это имя. Это будет двоичная несовместимость.

Обратите внимание, что отличия в определенных макросах могут исходить из нескольких разных мест. Во-первых, разные версии компилятора могут определять разные макросы (или определять макросы для разных значений). Например, есть макросы, идентифицирующие тип системы, которую вы компилируете, и определение версии компилятора. Различия в макросах также могут поступать из системных файлов заголовков, которые могут иметь разные #define. Более того, система сборки может определять макросы, указывающие, были ли обнаружены или не найдены в системе определенные вещи (например, предварительно установленные библиотеки).

Обратите внимание, что бинарная несовместимость, которую вы видите, может быть преднамеренной, чтобы предотвратить попадание в более тонкую двоичную несовместимость, которая не отображается при компиляции, но вызывает определенные ошибки при определенных условиях.

+0

Я пытаюсь создать одну и ту же разделяемую библиотеку (т. Е. Тот же код) на двух разных машинах, имеющих точно такую ​​же среду сборки (версия компилятора и т. Д.). На обеих машинах код, который будет скомпилирован, будет таким же, как и директива препроцессора на обеих машинах. Если определение директивы удалено на обеих машинах, двоичные файлы точно совпадают. Как препроцессорная директива создает несоответствие, даже если скомпилированный код будет одинаковым на обеих машинах? – user1153298

+0

У этих машин также установлены те же самые библиотеки? Специально для библиотек, используемых рассматриваемой общей библиотекой? – celtschk

+0

Да, те же библиотеки, что и библиотеки. – user1153298

Смежные вопросы