Мой компилятор не анализирует escape-последовательности, как ожидалось

Я пытаюсь выполнить статический анализ своего кода с помощью инструмента. Makefile содержит:

export TASK=MY_TASK_NAME
my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=\"$(TASK)\" -o missionFile.o missionFile.c

Я обнаружил, что это выполняется без проблем в RedHat, но не работает в моей среде Cygwin. Я назначаю переменную __TASK_NAME__ беззнаковому символу в файле C, например:

const unsigned char TASK_NAME[] = __TASK_NAME__;

Я получаю сообщение об ошибке:

gcc: no input files

Я очень уверен, что все мои аргументы верны, и я имею в виду источники в правильном каталоге. Мне кажется, что -- останавливает анализ управляющих последовательностей в команде в Windows. Может ли кто-нибудь помочь мне с обходным путем?

Это не имеет ничего общего с тем, что gcc не выполняет синтаксический анализ - это связано с тем, что gcc не предоставляет [входные] файлы, которые он ожидает. Нет файлов, нечего разбирать / компилировать. Итак, что вызывает gcc (например, что такое «my_static_code_tool»?) И почему не предоставляет ожидаемые параметры? Имеет ли этот инструмент просто совместимость с окружением (например, использует ли он другую оболочку для запуска gcc)?

user2864740 26.10.2018 09:08

Я не совсем понимаю. Я предполагаю, что gcc не нуждается в параметрах, которые должны быть предоставлены инструментом для его работы. Инструменту нужны скомпилированные объекты. А в gcc есть исходный файл, имя объектного файла и параметры, необходимые для выполнения компиляции. Я также хочу сказать, что если я удалю -, компиляция будет работать без этой ошибки.

Müller 26.10.2018 09:12
"gcc: нет входных файлов" - значит, gcc не получает действительный источник / файлы / конфигурацию и немедленно отключается.
user2864740 26.10.2018 09:13

В -- в штатных оболочках нет ничего особенного. Это аргумент, понимаемый отдельными программами, чтобы делать разные вещи. В git, то есть он используется как git checkout rev -- file, но -- не имеет встроенной магии оболочки и не изменяет какие, с которым оболочка вызывает команду git; часть file по-прежнему подчиняется всем нормальным правилам синтаксического анализа оболочки. (Теперь кавычки \ экранирование \ переменные могут обрабатываться по-разному в разных оболочках ... и Windows немного изменяет параметры исполняемого файла как, предоставленные, хотя Cygwin пытается скрыть это.)

user2864740 26.10.2018 09:14
1
4
41
1

Ответы 1

-- используется инструментом для ознакомления с компилятором и его аргументами [и тем самым информирует инструмент о том, что следующее является специфическим для компилятора]. GCC имеет все необходимые исходные файлы / файлы / конфигурацию, определенные в Makefile. Однако он не был полностью обработан в оболочке Cygwin (обработка команды остановилась с экранированием, следовательно, возникла соответствующая ошибка gcc).

Решение, которое я использовал для этой работы, - это препроцессорное преобразование в струны.

C файл:

#define STRINGIFY_IT(str) STRING_OF(str)
#define STRING_OF(str) #str

const unsigned char TASK_NAME[] = STRINGIFY_IT(__TASK_NAME__);

Makefile:

export TASK=MY_TASK_NAME
my_static_code_tool.exe <arguments> -- gcc <arguments..> -D__TASK_NAME__=$(TASK) -o missionFile.o missionFile.c

Итак, если кто-либо из вас столкнется с такими проблемами в будущем со сторонними инструментами, постарайтесь не передавать строковые аргументы через командную строку в GCC (поскольку их нужно будет экранировать, и это может сломать команду)

Другие вопросы по теме