Проверка значения символа препроцессора (#define)

я пытаюсь кросс-компилировать приложение в другую систему. Я создал все зависимости и начал компилировать. Затем это останавливается с одной из моих библиотек зависимостей, а именно Qt3, что вызывает ошибки компилятора:

Ошибка: ожидаемое имя класса перед токеном "{"

а также

Ошибка: «QMutex» не называет тип

Я подозреваю, что символ Q_EXPORT определен неправильно, потому что я забыл смоделировать некоторые настройки среды. Но поскольку его определение зависит от символов, которые зависят от символов, которые зависят от символов и так далее, его трудно проверить.

Простой вывод его в тестовой программе тоже не работает, потому что значение Q_EXPORT не всегда можно преобразовать в строку.

Мой вопрос: Как мне проверить значение символа препроцессора (во время компиляции/предварительной обработки) с помощью компилятора GNU.

Я думал, что будет вариант для этого, но я ничего не нашел при поиске в Интернете.


person Detonar    schedule 22.01.2018    source источник
comment
символ препроцессора   -  person Detonar    schedule 22.01.2018
comment
Существует переключатель компилятора -E GCC.   -  person Ron    schedule 22.01.2018
comment
Компилятор gnu покажет раскрытие макросов, если он вызывается с одним из -d‹буквы› варианты.   -  person G.M.    schedule 22.01.2018
comment
Проверьте этот вопрос stackoverflow.com/ вопросы/12637392/   -  person user1186960    schedule 22.01.2018
comment
@user1186960 user1186960 - Спасибо, это выглядит полезно. Было бы неплохо, если бы я мог добавить это, не меняя источник.   -  person Detonar    schedule 23.01.2018


Ответы (1)


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

Затем вы можете взять фактическую команду компиляции и заменить -c на -E или что-то подобное, чтобы проверить фактически сгенерированный вывод препроцессора. Затем найдите фактическое место в исходном коде, который вы компилируете - ожидайте, что вывод -E будет ОГРОМНЫМ - миллион строк вывода не является чем-то необычным. Используйте символы препроцессора #file и #line, чтобы отслеживать, в каком файле вы находитесь и на какой строке находитесь.

[1] Не совсем верно для всех компиляторов, поскольку именно для решения проблемы, заключающейся в том, что макросы затрудняют отслеживание того, что на самом деле делает код, современные компиляторы расширяют макросы во время правильного разбора кода. Однако, по-видимому, это не помогает в данном конкретном случае.

person Mats Petersson    schedule 22.01.2018
comment
К сожалению, поскольку препроцессор прекращает выполнение после обнаружения моей ошибки, он не создает выходной файл (пустой файл). - person Detonar; 22.01.2018
comment
Этого не должно происходить, если вы выполняете только предварительную обработку. - person Mats Petersson; 23.01.2018
comment
Нет, вы используете make, чтобы отобразить команду компиляции, затем скопируйте и вставьте ее в командную строку (или файл для использования в качестве сценария) и отредактируйте это, чтобы иметь -E вместо -c - возможно, удалите/измените -o something тоже. - person Mats Petersson; 23.01.2018