- Корректная установка config.h для разделяемой библиотеки с помощью автоинструментов
- Решение
- Другие решения
- Include config h windows
- About
- unixforum.org
- Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
- Include config h windows
- About
Корректная установка config.h для разделяемой библиотеки с помощью автоинструментов
Я конвертирую программу на C ++, которая использует систему сборки autotools для использования совместно используемой библиотеки, представляя введение в libtool. Большая часть функциональности программы размещается в разделяемой библиотеке, которая загружается основной программой, чтобы в будущем к общему коду могли обращаться другие программы.
Во всех источниках программы и библиотеки генерируется автозаголовок config.h используется с обычным макросом:
В configure.ac я использую макрос для его генерации:
У меня вопрос, нужно ли устанавливать config.h чтобы другие могли использовать мою библиотеку, и если да, то как это сделать, и следует ли ее переименовать, чтобы избежать конфликтов и т. д.?
Больше всего информации я нашел здесь:
Но это вряд ли официальный источник.
Решение
Вам нужно будет установить config.h если это влияет на интерфейс. В практическом плане, если #define требуется заголовок (и), а не только .cc блоки реализации / компиляции.
Если config.h проблема, вы можете указать другое имя в AC_CONFIG_HEADERS макро. например., AC_CONFIG_HEADERS([foo_config.h]) ,
Самый простой способ установить заголовок, предполагая Automake , это с:
на высшем уровне Makefile.am , nodist Приставка сообщает AutoMake, что foo_config.h генерируется, а не распространяется с пакетом.
Если не используете automake, установите foo_config.h в $includedir , $exec_prefix/include возможно, более правильный расположение сгенерированного заголовка, но на практике прежнее расположение хорошо.
Я избегаю использования config.h , передав соответствующие определения в CPPFLAGS или же foo_CPPFLAGS вместе с AC_SUBST в Makefile.am для исходных сборок, или AC_SUBST в foo.h.in генерировать заголовки во время настройки. Много config.h это тестовый шум. Это требует больше инфраструктуры, но это то, что я предпочитаю. Я не рекомендовал бы такой подход, если вы не знакомы с автоинструментами.
Другие решения
Никогда Когда-либо установить автозаголовок config.h ,
Последнее, что нужно пользователям вашей библиотеки — это вмешательство макросов, вытекающих из вашего config.h , Ваша библиотека может иметь HAVE_FOOBAR , но мое программное обеспечение может быть скомпилировано таким образом, чтобы Foobar отключен, так что HAVE_FOOBAR сломает мою компиляцию.
Макрос AX_PREFIX_CONFIG из архива это обходной путь, где все становится с префиксом.
Лучшим подходом является создание файла шаблона (например, blargconfig.h.in ) с такими строками:
А потом AC_SUBST() эти переменные в configure.ac :
Затем перечислите его как выходной файл:
.h файл должен быть указан с nodist_include_HEADERS ; .h.in файл будет автоматически распространяться, потому что он указан в AC_CONFIG_FILES ,
Назначение для таких файлов обычно $libdir/packagename/include , Увидеть GLib например , хотя они генерируют glibconfig.h без шаблона (написав весь встроенный код создания в configure.ac , как автобук предлагает ). Я считаю этот подход менее ремонтопригодным, чем использование AC_SUBST , но он более гибкий.
Конечно, чтобы помочь компилятору найти зависящий от платформы заголовок, вы, вероятно, также захотите написать скрипт pkgconfig, как это делает GLib.
Include config h windows
Config.h is a single-header library written in C for parsing configuration files .
Parsing configuration files is common task for all kinds of applications. This library parses human-readable configuration files for your existing or future C applications. Using Config.h in your application is easy. Just add Config.h to your project directory and include it.
Config.h is licensed under the ISC license
- Single-header library for easy integration into existing projects
- Human-readable configuration file format
- Support of different variable types: int , double , string , bool , int[8, 16, 32, 64] , and uint[8, 16, 32, 64]
- Simple interface with only one public function: Config_load
- Support of function callbacks for advanced configuration control
- Liberal license for free and commercial software
An example with all data types and a callback can be found in example.c.
A few preprocessor definitions can be set to control the behavior of Config.h . They need to be set before including Config.h .
#define . | Description |
---|---|
CONFIG_IMPLEMENTATION | The next #include «Config.h» will include the implementation in addition to the header. This is required for each project in exactly one .c -file. |
CONFIG_VERBOSE | Prints all verbose messages to stderr ( CONFIG_VERBOSE_DUPLICATE , CONFIG_VERBOSE_MISSING , CONFIG_VERBOSE_UNUSED ). |
CONFIG_VERBOSE_DUPLICATE | Prints to stderr, if config file contains the same key more than once. |
CONFIG_VERBOSE_MISSING | Prints to stderr, if config file does not contain a key specified as CONFIG_ITEM. |
CONFIG_VERBOSE_UNUSED | Prints to stderr, if config file contains keys not used by the application. |
CONFIG_NO_EXIT_ON_ERROR | No application exit on a parsing error (but output to stderr). The erroneous config will not be set to the variable. |
CONFIG_DEBUG | Debug output for each parsed line, only required for library testing. |
About
A single-header library for parsing simple configuration files
unixforum.org
Форум для пользователей UNIX-подобных систем
- Темы без ответов
- Активные темы
- Поиск
- Статус форума
Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение жучара » 29.06.2019 19:28
Друзья! Оно и без этого работает.
Но всё по порядку.
Обсуждаем эту статью
Там сказано как написать исходник и собрать их него файл .tar.gz
И вот среди прочего сказано, что при выполнении ./configure (на сборочной машине) получается Makefile с длиной длинной строкой
А в Makefile вместо той кучи параметров будет указано имя файла config.h:
Которое и будет фигурировать в командной строке g++ (выборка из команды make):
Всё так и происходит. Но я специально упустил один спорный шаг автора- он говорит, что config.h нужно включать в КАЖДЫЙ из исходников. Ладно бы в один какой, а то в КАЖДЫЙ!:
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение s.xbatob » 29.06.2019 19:57
Зачем в каждый? Только туда, где используются #define оттуда.
P.S. autotools за годы своего развития превратились в какой-то autohell В новых проектах его лучше не использовать. Благо, альтернативы есть, и куда более вменяемые.
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение Bizdelnick » 29.06.2019 23:30
в консол и вку́пе (с чем-либо) в общем в ообще | в течени е (часа) нович ок нюанс п о умолчанию | приемл емо пробле ма проб овать тра фик |
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение жучара » 30.06.2019 09:29
Тем более, что командная строка одна и та же, а значит, g++ одинаково будет работать что так, что эдак. Я писал уже это.
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение Bizdelnick » 30.06.2019 10:50
в консол и вку́пе (с чем-либо) в общем в ообще | в течени е (часа) нович ок нюанс п о умолчанию | приемл емо пробле ма проб овать тра фик |
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение жучара » 30.06.2019 15:56
небольшой эксперимент показал, что если заголовочный файл явно не присоединить к исходникам, то компилятор действительно о нём ничего знать не будет.
Для меня это было не столь очевидно из-за конструкции
А если я не прав в своих предположениях, тогда она просто аппендикс.
Получается, мы добавляем,
/Desktop/hello_good$ make
Making all in src
make[1]: Entering directory `/home/user/Desktops/Desktop1/hello_good/src’
make all-am
make[2]: Entering directory `/home/user/Desktops/Desktop1/hello_good/src’
g++ -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
g++ -g -O2 -o helo main.o
make[2]: Leaving directory `/home/user/Desktops/Desktop1/hello_good/src’
make[1]: Leaving directory `/home/user/Desktops/Desktop1/hello_good/src’
make[1]: Entering directory `/home/user/Desktops/Desktop1/hello_good’
make[1]: Цель `all-am’ не требует выполнения команд.
make[1]: Leaving directory `/home/user/Desktops/Desktop1/hello_good’
user@debian:
И самое главное- зачем автор пихает #include сразу в несколько исходников? Достаточно же ведь в один (в тот, где main()).
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение s.xbatob » 30.06.2019 18:17
Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?
Сообщение жучара » 30.06.2019 19:30
В своей квалификационной работе мне нужно написать консольную (необязательно консольную, но я писал консольную) программу-сервер A, которая принимала параметром имя файла. По запуску программы она устанавливала соединение с клиентами, установленными и работающими на компах в локальной сети. Разбивала файл на несколько частей по количеству соединений (в сети одновременно могло работать произвольное количество компов) произвольного размера (примерно одинаковых), шифровала каждую часть и по установленному соединению посылала каждую зашифрованную часть-файл на предназначенный ему клиент, где он хранился неопределённо долго в определённой директории.
Также писал программу-сервер B, которая совершала обратные действия- опять таки устанавливала соединения, собирала эти файлы-части, расшифровывала их, конкатенировала их в исходный файл.
Писал на плюсах, библиотеки pthread, многопоточность, проверка контрольных сумм, обмен ключами, сокеты, мокеты, госты шифрования и прочая муть.
Единственное, в чём могу ошибиться (не помню просто) быть может программы A и B были не серверами, а клиентами. Мы ведь помним, что сервер, что клиент работают абсолютно одинаково (как напишешь). Принципиальная разница лишь в момент установки соединения. Та, программа, которая слушает- та сервер. А та, которая посылает приветственное сообщение- клиент. Как у меня было, я не помню уже. И это только один проект.
Набил ли я руку в программировании? Я бы не сказал. Но до задаваемых вопросов вполне дорос, мне кажется. Я же не виноват, что в других плохих осях достаточно слепить командную строку компилятора и дело в шляпе. Вся переносимость заключается в переносе папки с программой. Потому тут такие вопросы и получаются.
упрёк принимается, но что делать-то? Другого-то всё равно ничего нет.
. И да, я просто напомню вопрос- зачем автор подключает заголовочный файл в КАЖДЫЙ исходник? Я понимаю, за автора никто не в ответе, просто спросить не кого, а может, знает кто. Извините.
Include config h windows
Config.h is a single-header library written in C for parsing configuration files .
Parsing configuration files is common task for all kinds of applications. This library parses human-readable configuration files for your existing or future C applications. Using Config.h in your application is easy. Just add Config.h to your project directory and include it.
Config.h is licensed under the ISC license
- Single-header library for easy integration into existing projects
- Human-readable configuration file format
- Support of different variable types: int , double , string , bool , int[8, 16, 32, 64] , and uint[8, 16, 32, 64]
- Simple interface with only one public function: Config_load
- Support of function callbacks for advanced configuration control
- Liberal license for free and commercial software
An example with all data types and a callback can be found in example.c.
A few preprocessor definitions can be set to control the behavior of Config.h . They need to be set before including Config.h .
#define . | Description |
---|---|
CONFIG_IMPLEMENTATION | The next #include «Config.h» will include the implementation in addition to the header. This is required for each project in exactly one .c -file. |
CONFIG_VERBOSE | Prints all verbose messages to stderr ( CONFIG_VERBOSE_DUPLICATE , CONFIG_VERBOSE_MISSING , CONFIG_VERBOSE_UNUSED ). |
CONFIG_VERBOSE_DUPLICATE | Prints to stderr, if config file contains the same key more than once. |
CONFIG_VERBOSE_MISSING | Prints to stderr, if config file does not contain a key specified as CONFIG_ITEM. |
CONFIG_VERBOSE_UNUSED | Prints to stderr, if config file contains keys not used by the application. |
CONFIG_NO_EXIT_ON_ERROR | No application exit on a parsing error (but output to stderr). The erroneous config will not be set to the variable. |
CONFIG_DEBUG | Debug output for each parsed line, only required for library testing. |
About
A single-header library for parsing simple configuration files