Для начала, я не думаю, что будет хорошей идеей давать common.h
компилятору в make-файле:
@$(CC) $(C_FLAGS) -c sgbd_server.c common.h
Это было бы лучше, чем просто:
@$(CC) $(C_FLAGS) -c sgbd_server.c
Заголовочные файлы обычно включаются только с #include
. Похоже, вы говорите компилятору попытаться скомпилировать common.h
как отдельный C-файл. Это одно из различий между командами компиляции клиента и сервера, и вы должны это исправить.
Единственное, что я могу предложить, это то, что вы, возможно, не получаете файлы заголовков, которые вы думаете вы получаете. Начните с помещения строки:
#error Urk! in common.h
наверху вашего common.h
и убедитесь, что сборка там не удалась.
Если нет, то этот файл приходит откуда-то еще. Вы также можете сделать то же самое с файлом sgbd_server.h
.
На основании ваших правок:
Я нашел несколько файлов .ghc, которые лежали в моей исходной папке. Поскольку они не очищаются программой make clean, я удалил эти файлы вручную. Угадай, что? Нет предупреждения Что это за файлы и почему они созданы?
Это, если предположить, что ghc
было опечаткой, и вы имели в виду gch
, предварительно скомпилированные заголовки, сгенерированные gcc
, по крайней мере частично, чтобы ускорить процесс компиляции. Вместо того, чтобы обрабатывать заголовочный файл много раз во время сборки (один раз для исходного файла, который его включает), его предварительная компиляция один раз и использование предварительно скомпилированной версии намного эффективнее.
Я думаю, что это, скорее всего, вызвано тем, что вы включили common.h
в командной строке компилятора, когда вы работали на сервере. По умолчанию заголовочные файлы, переданные непосредственно gcc
, будут преобразованы в предварительно скомпилированные заголовочные файлы и будут использоваться после этого в предпочтении. Чтобы проверить это, я создал файл qq.h
, выполнил gcc qq.h
и выдал qq.h.gch
.
Вполне вероятно, учитывая, что удаление их решило вашу проблему, что эти файлы каким-то образом вызывали ваши проблемы (будь то наличие предварительно скомпилированных заголовков старше реальных заголовков или что-то еще целиком). Есть большая вероятность, что ваша строка компиляции:
@$(CC) $(C_FLAGS) -c sgbd_server.c common.h
сначала скомпилирует серверную программу, включая старый предварительно скомпилированный заголовок, , а затем сделает новый предварительно скомпилированный заголовок из более нового файла заголовка.
Вероятно, поэтому изменение common.h
не имело (немедленного) эффекта. Вам потребуется make ; touch common.h ; make
, чтобы убедиться, что более новый предварительно скомпилированный файл заголовка был использован в программе сервера.
Если вы хотите отследить это до первопричины и получить правильное объяснение, это вопрос вкуса - есть школа мысли, что вы должны иногда просто записывать, как вы это исправили и не беспокоиться слишком сильно, чтобы не запутаться в самой природе самой реальности.
Не я, конечно, я тип личности, который будет пытаться отследить мои проблемы до отдельной субатомной частицы, которая вызвала ее, но иногда прагматизм требует, чтобы я отпустил это: -)