Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 29.06.2019 19:28

Друзья! Оно и без этого работает.
Но всё по порядку.
Обсуждаем эту статью

Там сказано как написать исходник и собрать их него файл <пакета>.tar.gz

И вот среди прочего сказано, что при выполнении ./configure (на сборочной машине) получается Makefile с длиной длинной строкой
DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"helo\" -DVERSION=\"0.1\"
А потом эта строка при команде make передаётся параметром команде g++ и получается команда слишком длинная, может не сработать. (Это всё написано в статье)

Shell

g++ -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"helo\" -DVERSION=\"0.1\" -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
И чтобы такой длинной свадьбы не было, они придумали все вот эти вот параметры запихать в заголовочный файл config.h. Потом мы его имя укажем в Makefile.am, вот так:
AC_CONFIG_HEADER(src/config.h)
И файл config.h сформируется сам по команде ./configure. И в нём-то и будут указаны все вот эти ключи:
файл config.h

Код: Выделить всё

/* src/config.h.  Generated from config.h.in by configure.  */
/* src/config.h.in.  Generated from configure.ac by autoheader.  */

/* Name of package */
#define PACKAGE "helo"

/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""

/* Define to the full name of this package. */
#define PACKAGE_NAME ""

/* Define to the full name and version of this package. */
#define PACKAGE_STRING ""

/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME ""

/* Define to the home page for this package. */
#define PACKAGE_URL ""

/* Define to the version of this package. */
#define PACKAGE_VERSION ""

/* Version number of package */
#define VERSION "0.1"
А в Makefile вместо той кучи параметров будет указано имя файла config.h:

DEFS = -DHAVE_CONFIG_H

Которое и будет фигурировать в командной строке g++ (выборка из команды make):

Shell

g++ -DHAVE_CONFIG_H -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
+++++++++++++++++++++++++++++++++++++++++++++++++

Всё так и происходит. Но я специально упустил один спорный шаг автора- он говорит, что config.h нужно включать в КАЖДЫЙ из исходников. Ладно бы в один какой, а то в КАЖДЫЙ!:
Включите следующий текст в начало файлов main.cpp, problem.cpp, problem.h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
Зачем я не пойму, такие движения. Не нужно его никуда включать. Он просто набор ключей. Наша задача- правильно передать его имя компилятору g++, он его раскроет правильно и... И всё. Чё надо сделает. Что, собственно и происходит. Я написал "Hello, word!" с использованием config.h. И сперва указывал этот файл заголовочным в исходнике (у меня один исходник, main.cpp), а потом не указывал. Командная строка g++ в обоих случаях одинакова с точностью до буквы:

Shell

g++ -DHAVE_CONFIG_H -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
Вот и вопрос, собственно. Так не нужно, наверное, config.h указывать заголовочным в исходниках? Их так-то много может быть, да и структура папки src можеть быть сложной... Спасибо, кто откликнется. (Не могу же я автора спросить, спрашивать больше некого)
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 768
ОС: RfRemix

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение s.xbatob » 29.06.2019 19:57

Зачем в каждый? Только туда, где используются #define оттуда.

P.S. autotools за годы своего развития превратились в какой-то autohell :( В новых проектах его лучше не использовать. Благо, альтернативы есть, и куда более вменяемые.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15608
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение Bizdelnick » 29.06.2019 23:30

жучара писал(а):
29.06.2019 19:28
Наша задача- правильно передать его имя компилятору g++, он его раскроет правильно и...
Во-первых, с чего Вы взяли, что g++ будет раскрывать что-то, отсутствующее в исходниках? Во-вторых, Вы вообще не можете рассчитывать на то, что для сборки будет использоваться именно g++, а не какой-то другой компилятор.
жучара писал(а):
29.06.2019 19:28
Я написал "Hello, word!" с использованием config.h. И сперва указывал этот файл заголовочным в исходнике (у меня один исходник, main.cpp), а потом не указывал. Командная строка g++ в обоих случаях одинакова с точностью до буквы
Конечно, она одинакова. Она не зависит от содержимого компилируемого файла, а только от Makefile.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 30.06.2019 09:29

Bizdelnick писал:
29.06.2019 23:30
Во-первых, с чего Вы взяли, что g++ будет раскрывать что-то, отсутствующее в исходниках?
это не что-то, а config.h. И я не писал, что он отсутствует в исходниках.
:cc_detective:
нет, не писал. А писал я обратное,
файл config.h сформируется сам по команде ./configure
. И он действительно формируется. Просто авторы предлагают его включать заголовочным в каждый исходник, вот так:

Код: Выделить всё

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
int main ()
{
  printf ("Hello, word!\n");
  return 0;
}
а я нет, вот так:

Код: Выделить всё

#include <stdio.h>
int main ()
{
  printf ("Hello, word!\n");
  return 0;
}
(Там исходники другие правда, посложнее, но не суть.) Я писал уже это. Ну так вот, я хотя спрашивал уже, но ещё раз спрошу- может, его не нужно указывать заголовочным в каждом исходнике? Вот и s.xbatob говорит:
s.xbatob писал:
29.06.2019 19:57
Зачем в каждый? Только туда, где используются #define оттуда.
Тем более, что командная строка одна и та же, а значит, g++ одинаково будет работать что так, что эдак. Я писал уже это.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Bizdelnick писал:
29.06.2019 23:30
Во-вторых, Вы вообще не можете рассчитывать на то, что для сборки будет использоваться именно g++, а не какой-то другой компилятор.
это неважно сейчас.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15608
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение Bizdelnick » 30.06.2019 10:50

жучара писал(а):
30.06.2019 09:29
И я не писал, что он отсутствует в исходниках.
жучара писал(а):
30.06.2019 09:29
Я писал уже это.
Так я это и имел в виду. Файл не включён в компилируемые исходники, поэтому компилятор о нём ничего знать не может.
жучара писал(а):
30.06.2019 09:29
командная строка одна и та же, а значит, g++ одинаково будет работать что так, что эдак.
Вы полагаете, что результат его работы совершенно не зависит от содержимого компилируемого файла? Серьёзно?
Вы слишком рано взялись за autotools. Вам надо сначала научиться компилировать код вручную, потом освоить make, и только после этого браться за более навороченные обёртки (и я полностью согласен с s.xbatob, что autotools — один их худших вариантов сборочных систем на сегодняшний день).
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 30.06.2019 15:56

Bizdelnick писал:
30.06.2019 10:50
Файл не включён в компилируемые исходники, поэтому компилятор о нём ничего знать не может.
небольшой эксперимент показал, что если заголовочный файл явно не присоединить к исходникам, то компилятор действительно о нём ничего знать не будет.

Для меня это было не столь очевидно из-за конструкции

Shell

-DHAVE_CONFIG_H -I.
, я-то думал из-за неё и не нужно указывать

Shell

#include <config.h>
в исходниках.

А если я не прав в своих предположениях, тогда она просто аппендикс.

Получается, мы добавляем,

Shell

#include <config.h>
в исходники, компилятор их компилит, подхватывает

Shell

#include <config.h>
, всё, что там определено, задействует... А

Shell

-DHAVE_CONFIG_H -I.
-то для чего тогда? И без неё сработает.
Проверим, после ./configure залезем в Makefile и в src/Makefile и напишем
#DEFS = -DHAVE_CONFIG_H
DEFS =

Shell

user@debian:~/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:~/Desktop/hello_good$
Вот и всё. Вопрос только, зачем они огород городят с

Shell

-DHAVE_CONFIG_H -I.
, если config.h И ТАК находится в одном каталоге с main.cpp. Разве что этот вот макрос может быть другим:

Код: Выделить всё

AС_CONFIG_HEADER(src/config.h)
То есть config.h может находиться и не в одном каталоге с исходниками. Но разве в этом случае прописывание пути к config.h не решает?

Код: Выделить всё

#ifdef HAVE_CONFIG_H
#include "путь/к/config.h"
#endif
И самое главное- зачем автор пихает #include <config.h> сразу в несколько исходников? Достаточно же ведь в один (в тот, где main()).

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Bizdelnick писал:
30.06.2019 10:50
Вы полагаете, что результат его работы совершенно не зависит от содержимого компилируемого файла? Серьёзно?
неплохо сказано :D
Bizdelnick писал:
30.06.2019 10:50
Вы слишком рано взялись за autotools. Вам надо сначала научиться компилировать код вручную, потом освоить make, и только после этого браться за более навороченные обёртки (и я полностью согласен с s.xbatob, что autotools — один их худших вариантов сборочных систем на сегодняшний день).
честно говоря, у меня нет времени. Приходится вот так вот галопом по европам. Вы уж извините. Это же я всё для работы. Скоро начнут на пятки наступать- поставь то, поставь это (я про программы), надо как-то быть готовым, что ли. Такие вот у нас реалии. На 14-то тыщ не идут люди. А на счёт autotools, так я подобное слышал мильён мильёнов раз. Изучал бы я что-нибудь другое, вы бы сказали "изучай autotools"
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 768
ОС: RfRemix

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение s.xbatob » 30.06.2019 18:17

жучара
Тут всё просто: в своём проекте мы можем творить что угодно.
Но вы изучаете статью по созданию переносимых приложений, причём написанную 13 лет назад. За это время приличная часть того, что тогда было полезно, превратилось в предрассудки.
Вы сначала набейте руку в программировании, а уже потом подумайте о вечном :) Сделайте хоть что-нибудь полезное для себя, сами себе посопровождайте -- и большая часть вопросов отпадёт. Пока забудьте о переносимости, тем более, что на самом деле всё у них не так красиво. Потом разберётесь.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 30.06.2019 19:30

s.xbatob писал:
30.06.2019 18:17
Вы сначала набейте руку в программировании
В своей квалификационной работе мне нужно написать консольную (необязательно консольную, но я писал консольную) программу-сервер A, которая принимала параметром имя файла. По запуску программы она устанавливала соединение с клиентами, установленными и работающими на компах в локальной сети. Разбивала файл на несколько частей по количеству соединений (в сети одновременно могло работать произвольное количество компов) произвольного размера (примерно одинаковых), шифровала каждую часть и по установленному соединению посылала каждую зашифрованную часть-файл на предназначенный ему клиент, где он хранился неопределённо долго в определённой директории.

Также писал программу-сервер B, которая совершала обратные действия- опять таки устанавливала соединения, собирала эти файлы-части, расшифровывала их, конкатенировала их в исходный файл.

Писал на плюсах, библиотеки pthread, многопоточность, проверка контрольных сумм, обмен ключами, сокеты, мокеты, госты шифрования и прочая муть.

Единственное, в чём могу ошибиться (не помню просто) быть может программы A и B были не серверами, а клиентами. Мы ведь помним, что сервер, что клиент работают абсолютно одинаково (как напишешь). Принципиальная разница лишь в момент установки соединения. Та, программа, которая слушает- та сервер. А та, которая посылает приветственное сообщение- клиент. Как у меня было, я не помню уже. И это только один проект.

Набил ли я руку в программировании? Я бы не сказал. Но до задаваемых вопросов вполне дорос, мне кажется. Я же не виноват, что в других плохих осях достаточно слепить командную строку компилятора и дело в шляпе. Вся переносимость заключается в переносе папки с программой. Потому тут такие вопросы и получаются.
s.xbatob писал:
30.06.2019 18:17
Но вы изучаете статью по созданию переносимых приложений, причём написанную 13 лет назад.
упрёк принимается, но что делать-то? Другого-то всё равно ничего нет.

... И да, я просто напомню вопрос- зачем автор подключает заголовочный файл в КАЖДЫЙ исходник? Я понимаю, за автора никто не в ответе, просто спросить не кого, а может, знает кто. Извините.
Последний раз редактировалось жучара 30.06.2019 19:57, всего редактировалось 1 раз.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15608
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение Bizdelnick » 30.06.2019 19:57

жучара писал(а):
30.06.2019 15:56
Для меня это было не столь очевидно из-за конструкции

Shell

-DHAVE_CONFIG_H -I.
, я-то думал из-за неё и не нужно указывать

Shell

#include <config.h>
в исходниках.

А если я не прав в своих предположениях, тогда она просто аппендикс.

Получается, мы добавляем,

Shell

#include <config.h>
в исходники, компилятор их компилит, подхватывает

Shell

#include <config.h>
, всё, что там определено, задействует... А

Shell

-DHAVE_CONFIG_H -I.
-то для чего тогда? И без неё сработает.
И снова Вы ничего не поняли, и снова я не знаю, как Вам это объяснить в рамках сообщения разумного размера. Вам надо разобраться, как работает компилятор. Что до стадии собственно компиляции код обрабатывается препроцессором, что строки, начинающиеся с # — это ничто иное, как директивы препроцессора, что опции -D и -I тоже предназначены для препроцессора. Опция -D определяет макрос (определён ли он — проверяется директивой #ifdef или #if defined), опция -I указавает каталог для поиска файлов, включаемых директивой #include. У автора всё продумано и всё на своих местах, единственное, что можно убрать — это проверку #ifdef HAVE_CONFIG_H и вместе с ней опцию -DHAVE_CONFIG_H, чтобы файл config.h включался всегда.
По поводу того, нужно ли включать config.h во все файлы, s.xbatob Вам уже ответил в первом же своём сообщении.
Учитесь обращаться с компилятором, без этого обойтись не получится. Если времени мало — плюньте на autotools и займитесь лучше документацией gcc (или любого другого компилятора C/C++). Получите более универсальные и полезные базовые знания, без которых в autrotools разобраться всё равно не сможете.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 768
ОС: RfRemix

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение s.xbatob » 30.06.2019 20:01

жучара
По работе -- пишите вообще как придётся, не заботььесь ни о чём. Будете смеяться (или не будете), но приличная часть коммерческих проектов написана именно так: на от(censored)... на отстань.
Тем более по работе -- чем дурнее результат, тем дальше конкурренты. :(
Добавлено (20:14):
Ой, вы с вашей задачей с сетями научились работать?
Чтобы разобрать файл конфигурации (100500 библиотек вам в помощь), особого умения не надо.
А с сетями -- там вроде бы просто, но обязательно знать как они устроены. Хоть чуть-чуть.Про нынешний новомодный обмен сообщениями, под которым много чего за нас на низком уровне пашет -- отдельный разговор.
Спасибо сказали:

IMB
Сообщения: 2450
ОС: Debian

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение IMB » 01.07.2019 09:20

config.h опционален, включать его в исходники или нет решаете Вы, надо ли его генерироваьт тоже решается автором

если приложение не предполагается запускать на широком спекте железа и собирать различными toolchain, то без него вполне можно обойтись
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 07.07.2019 17:26

Не то, чтоб очень уж важно, но надо же выяснить. Автор заявляет эту вот конструкцию:

Shell

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
как
макрос защиты от повторного включения того же файла
Но это же не так. Нигде ни в одном исходнике да и в этой вот конструкции не видно, чтобы макрос HAVE_CONFIG_H отключался. Как он определится компилятором в командной строке,

Shell

g++ -DHAVE_CONFIG_H
, так он и будет. А значит config.h будет включаться всегда. Защиты от повторного включения то есть нет.

А вот так вот защита от повторного включения файла config.h есть

Shell

#ifdef HAVE_CONFIG_H
#include <config.h>
#undef HAVE_CONFIG_H
#endif
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15608
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение Bizdelnick » 07.07.2019 18:02

жучара писал(а):
07.07.2019 17:26
Защиты от повторного включения то есть нет.
Затрудняюсь сказать, что имел в виду автор. Может быть, в ходе подготовки статьи саму защиту он выкинул, а упоминания о ней в тексте убрать забыл.
жучара писал(а):
07.07.2019 17:26
А вот так вот защита от повторного включения файла config.h есть
Нет, так её тоже нет. Если ниже будет написано

Код: Выделить всё

#include "config.h"
файл благополучно включится. Защита от повторного включения должна быть внутри самого заголовочного файла, чтобы от неё был толк.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 07.07.2019 18:43

Bizdelnick писал:
07.07.2019 18:02
файл благополучно включится. Защита от повторного включения должна быть внутри самого заголовочного файла, чтобы от неё был толк.
заголовочный файл формируется ./configure. Странно, такой скрипт и такого пустяка сделать не может.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15608
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение Bizdelnick » 07.07.2019 18:51

Собственно, в этом файле и нет ничего такого, что могло бы создать проблемы при повторном включении.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 878
ОС: Gentoo

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение ormorph » 07.07.2019 18:59

жучара писал(а):
07.07.2019 17:26
А вот так вот защита от повторного включения файла config.h есть
Что то мало вероятно, что это защита.
Обычно добавляется в каждый заголовочный файл примерно такое:

Код: Выделить всё

#ifndef MYCLASS_H
#define MYCLASS_H
.........
.........
#endif
Означает если макрос MYCLASS_H не объявлен то содержимое будет включаться в компиляцию, иначе нет. Т.е. после первого включения данный макрос объявляется, и далее содержимое более не будет включаться в компиляцию.
А у вас в примере на оборот если HAVE_CONFIG_H объявлен, то содержимое будет
включаться в компиляцию. Т.е. если его не объявить, то вообще не будет включаться...
Упс ошибся там есть #undef HAVE_CONFIG_H )
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 07.07.2019 21:08

ormorph писал(а):
07.07.2019 18:59
Обычно добавляется в каждый заголовочный файл примерно такое:
я знаю, просто решил так не делать. Раз уж они автоматическое добавление такой конструкции не предусмотрели, значит, для чего-то это нужно было. Пока непонятно, для чего. Оплошность, что ли какая.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 1720
ОС: Mandriva => Gentoo (~amd64)

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение devilr » 07.07.2019 21:16

жучара писал(а):
07.07.2019 21:08
я знаю, просто решил так не делать. Раз уж они автоматическое добавление такой конструкции не предусмотрели, значит, для чего-то это нужно было. Пока непонятно, для чего. Оплошность, что ли какая.
А зачем файл с таким говорящим названием подключать более одного раза? По земной логике, конфигурация чего-либо осуществляется всего один раз, а не 15. :)
Соответственно и конструкцмя #ifndef не нужна. Более того, если её включить и подключить такой файл несколько раз - как раз будут глюки. А без - будет всё хорошо
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 240
ОС: minix 3.1.0

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение жучара » 07.07.2019 22:29

devilr писал(а):
07.07.2019 21:16
А зачем файл с таким говорящим названием подключать более одного раза?
по ошибке
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 768
ОС: RfRemix

Re: Почему при сборке из СВОИХ исходников необходимо добавлять заголовочный файл config.h в исходники?

Сообщение s.xbatob » 09.07.2019 11:26

жучара писал(а):
07.07.2019 22:29
devilr писал(а):
07.07.2019 21:16
А зачем файл с таким говорящим названием подключать более одного раза?
по ошибке
Ну, с таким подходом результата точно не будет.

А сам механизм придуман из-за того, что в общем случае заголовки друг друга подключают и отследить повторное включение затруднительно.

Только тут генерируемый config.h никого не подключает, и вообще там только небольшое кодичество #define. Ну, да его можно подключить или все их задавать в параметрах вызова компилятора. Но вы разберитесь один раз как вы собираетесь поступать.

И вообще ваша инструкция на самом деле о том, как использовать autotools. Мало того, что сама эта система зашла в тупик и давно не развивается, так ещё и статье лет 10. Хотя идея с генерируемыми заголовками с параметрами конфигурации здравая и в других сборочных системах тоже используется.
Спасибо сказали: