При использовании автоинструментов (с файлом config.h
) как для библиотеки, так и для программного обеспечения, построенного на этой библиотеке, компилятор жалуется на переопределение некоторых макросов (PACKAGE_NAME, PACKAGE_TARNAME и т. Д.).
Как я могу предотвратить это?
Файл config.h
необходим в библиотеке для распространения его настроек в программном обеспечении, которое его использует.
Прямо сейчас у меня есть скрипт-оболочка library_config.h
, который включает в себя исходный config.h
и предоставляет значения по умолчанию, когда пользователь не использует автоинструменты, но даже отменяет определение макросов в этом пакете. Я получаю предупреждение о переопределении от gcc.
#ifndef LIB_CONFIG_H
#define LIB_CONFIG_H
#ifdef HAVE_CONFIG_H
# include "config.h"
# undef PACKAGE
# undef PACKAGE_BUGREPORT
# undef PACKAGE_NAME
# undef PACKAGE_STRING
# undef PACKAGE_TARNAME
# undef PACKAGE_VERSION
# undef VERSION
#else
# if defined (WIN32)
# define HAVE_UNORDERED_MAP 1
# define TR1_MIXED_NAMESPACE 1
# elif defined (__GXX_EXPERIMENTAL_CXX0X__)
# define HAVE_UNORDERED_MAP 1
# else
# define HAVE_TR1_UNORDERED_MAP 1
# endif
#endif
#endif
Я считаю, что наилучшим вариантом было бы иметь библиотеку без этих макросов: как можно избежать определения PACKAGE, PACKAGE_NAME и т. Д. В библиотеке при использовании автоинструментов?
РЕДАКТИРОВАТЬ: попытаться объяснить лучше.
При использовании макроса AC_CONFIG_HEADER
в библиотеке configure.ac
я создаю файл config.h
с множеством полезных определений. Это определение полезно для самой библиотеки (как для ее скомпилированной части, так и для ее заголовочных файлов) И для клиентского программного обеспечения. Жаль, однако, что AC_CONFIG_HEADER
смешивает нужные мне полезные макросы с другими универсальными определениями с фиксированными именами (PACKAGE, PACKAGE_NAME), которые конфликтуют, когда autotools используются также для конфигурации клиентского программного обеспечения.