#c #header-files #autotools
#c #заголовочные файлы #autotools
Вопрос:
Я создаю оболочку на C. Тот самый .tar.gz файл, который я создал, работает совершенно нормально. Однако, когда я распаковываю это, исходный файл заголовка, который я использовал при создании указанного файла, изменяется, чтобы содержать код, используемый autotools. Есть ли способ сохранить исходный файл .h?
Для справки, это мой configure.ac:
AC_INIT([program_name], 1.0)
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_HEADERS([shell.h])
AC_CONFIG_FILES(Makefile)
AC_OUTPUT
The Makefile.am Программа является:
bin_PROGRAMS = shell
shell_SOURCES = main.c functions.c
Я надеялся, что когда я использую оболочку cat.h Я бы увидел исходные #include и #define, которые я создал. Однако в нем просто указано типичное значение autotools #defines для пакета и номер версии.
Я был бы очень признателен за любую помощь в этом, а также за объяснение того, что здесь на самом деле происходит, поэтому я больше этого не делаю.
Ответ №1:
AC_CONFIG_HEADERS
(documentation) выводит сгенерированный Autoconf заголовочный файл с информацией о пакете и среде, используемой для его компиляции.
Обычно вызывается этот файл, config.h
но вы, кажется, вызвали его, shell.h
что перезаписало другой shell.h
файл, который вы создали вручную, я полагаю?
Если это так, решением было бы использовать другое имя в AC_CONFIG_HEADERS
.
Комментарии:
1. … или, может быть, просто опустить
AC_CONFIG_HEADERS
. Похоже, у OP может быть совершенно неправильное представление о том, для чего он предназначен.
Ответ №2:
Как уже заметил @ptomato, AC_CONFIG_HEADERS
это для запроса, чтобы configure
скрипт при запуске создал для вас заголовочный файл, в котором он определяет макросы, передающие различную собранную им информацию, такую как результаты различных тестов. Аргумент макроса указывает имя, которое должен иметь этот сгенерированный файл. Это альтернатива передаче всей этой информации командам компиляции в командной строке. Это не имеет ничего общего с присвоением имени заголовочному файлу, предоставленному в источниках, и это, безусловно, приведет к замене любого такого заголовка. Это также бесполезно, если в ваших источниках нет #include
указанного заголовка.
Неясно, нужен ли вам такой заголовок конфигурации, но если shell.h
это заголовок, который вы предоставили, и вы не хотите configure
перезаписывать его, то не указывайте его имя в AC_CONFIG_HEADERS
. Вероятно, вы можете вообще обойтись без AC_CONFIG_HEADERS
этого, хотя лично мне это нравится, потому что его использование облегчает чтение конечного make
результата. Если вы продолжаете его использовать, вам нужно выбрать другое имя (например, обычное config.h
), и вам нужно, чтобы у всех ваших C-источников #include
был этот заголовок, прежде чем они сделают что-либо еще.
Чтобы сообщить Automake о заголовке, предоставленном в источниках, который в конечном итоге не установлен, просто укажите его среди _SOURCES
по крайней мере одного целевого объекта. Automake знает, что не следует пытаться компилировать заголовки, но перечисление их среди ваших исходных текстов гарантирует, что они будут упакованы в архивы дистрибутива, созданные с помощью make dist
. Существуют альтернативы, такие как перечисление таких заголовков в EXTRA_DIST
, но они менее традиционны.