Но всё по порядку.
Обсуждаем эту статью
Там сказано как написать исходник и собрать их него файл <пакета>.tar.gz
И вот среди прочего сказано, что при выполнении ./configure (на сборочной машине) получается Makefile с длиной длинной строкой
А потом эта строка при команде make передаётся параметром команде g++ и получается команда слишком длинная, может не сработать. (Это всё написано в статье)DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"helo\" -DVERSION=\"0.1\"
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 сформируется сам по команде ./configure. И в нём-то и будут указаны все вот эти ключи:AC_CONFIG_HEADER(src/config.h)
файл 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"
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 нужно включать в КАЖДЫЙ из исходников. Ладно бы в один какой, а то в КАЖДЫЙ!:
Зачем я не пойму, такие движения. Не нужно его никуда включать. Он просто набор ключей. Наша задача- правильно передать его имя компилятору g++, он его раскроет правильно и... И всё. Чё надо сделает. Что, собственно и происходит. Я написал "Hello, word!" с использованием config.h. И сперва указывал этот файл заголовочным в исходнике (у меня один исходник, main.cpp), а потом не указывал. Командная строка g++ в обоих случаях одинакова с точностью до буквы:Включите следующий текст в начало файлов main.cpp, problem.cpp, problem.h
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
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