автозаголовок создает макрос ВЕРСИИ, противоречащий другой переменной, определенной в другом файле заголовка

#macros #version #conflict #autoconf

Вопрос:

Мой configure.ac файл имеет строку, как показано ниже

 AC_INIT([myApp], [1.2.3], [dev@company.com])
 

затем автозаголовок/настройка создаст config.in , в котором у нас будет 2 макроса, как показано ниже,

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

/* Version number of package */
#define VERSION "1.2.3"
 

Мне также нужно построить sqlite в том же проекте , и файл заголовка sqlite также определяет переменную VERSION , затем я получил ошибку, как показано ниже

 ../../config.h:117:17: error: expected unqualified-id before string constant

 #define VERSION "1.2.3"
                 ^ ../../SQLiteCpp/include/SQLiteCpp/Database.h:35:21:note: in expansion of macro ‘VERSION’

 extern const char*  VERSION;        ///< SQLITE_VERSION string from the sqlite3.h used at compile time
 

Я должен вручную изменить config.in чтобы VERSION каждый раз комментировать макрос, чтобы продолжить сборку. Мои вопросы таковы:

  1. Почему 2 макроса созданы config.h PACKAGE_VERSION и VERSION выглядят одинаково, в чем разница?
  2. Как решить эту VERSION проблему с конфликтом макроса/переменной?

Спасибо

Ответ №1:

Почему и VERSION то и PACKAGE_VERSION другое ? Вероятно, обратная совместимость.

Как избежать определения VERSION ? AM_INIT_AUTOMAKE Документация на Automake информационной странице заканчивается абзацем, в котором подробно рассказывается о том, как избежать PACKAGE и VERSION быть AC_DEFINE d:

 AM_INIT_AUTOMAKE([... no-define ...])