Вопрос или проблема
Я пытаюсь использовать autoconf
для создания скрипта configure
. Однако некоторые заголовки, которые я хочу проверить, требуют дополнительных флагов компилятора (например, c++11
). Я частично справляюсь с этим, используя ответ здесь, где соответствующие строки выглядят так в файле configure.ac
.
AX_CXX_COMPILE_STDCXX_11(,[обязательный])
AC_CHECK_HEADER("CL/cl2.hpp")
но флаг std=gnu++11
не передается на этапе предварительной обработки AC_CHECK_HEADERS
, где я получаю странный результат, при котором он используется, но отсутствует:
проверка доступности CL/cl2.hpp... да
проверка присутствия CL/cl2.hpp... нет
Просматривая config.log
, я вижу следующие строки:
configure:3423: проверка присутствия CL/cl2.hpp
configure:3423: g++ -E conftest.cpp
In file included from conftest.cpp:19:0
/usr/include/CL/cl2.hpp:442:2: error #error Необходим компилятор Visual Studio 2013 или другой, поддерживающий C++11
где я ясно вижу, что флаг C++ не используется. Как можно использовать флаги компилятора на этих этапах предварительной обработки?
ИЗМЕНЕНИЕ
Я могу обойти это вручную, установив CXXCPP
вручную при запуске configure
, но я хотел бы, чтобы это работало без необходимости конечного пользователя знать об этом.
./configure CXXCPP="g++ -E -std=gnu++11"
Текущее решение, которое я придумал, заключается в том, чтобы вручную добавить:
CXXCPP="g++ -E -std=gnu++11"
прямо в файл configure.ac
. Я был бы рад услышать любые дополнительные ответы.
Мне пришлось запустить configure так:
./configure CCFLAGS="-std=c++11" CXXFLAGS="-std=c++11" CXXCPP="-std=c++11"
Ответ или решение
Для создания конфигурационного скрипта с использованием autoconf
в контексте проверки заголовков, требующих дополнительных флагов компилятора, таких как c++11
, необходимо правильно настроить файл configure.ac
. Ваша проблема заключается в том, что флаг -std=gnu++11
не передается на этапе препроцессора для проверки заголовков, что приводит к ошибкам в процессе конфигурации.
Настройка configure.ac
Шаг 1: Используйте макросы для проверки C++
Для начала убедитесь, что используете макрос AX_CXX_COMPILE_STDCXX_11
, который проверяет, поддерживает ли компилятор стандарт C++11, и добавляет соответствующие флаги. Это уже правильно настроено у вас в коде:
AX_CXX_COMPILE_STDCXX_11([, [mandatory]])
Шаг 2: Передача флагов компилятора
Для передачи нужных флагов компиляции в AC_CHECK_HEADER
, вам нужно сделать следующее:
- Убедитесь, что флаги добавлены в переменные
CXXFLAGS
иCPPFLAGS
, которые используются в процессе конфигурации.
Вы можете добавить в ваш configure.ac
следующий код:
# Установка флагов компиляции
CXXFLAGS="$CXXFLAGS -std=gnu++11"
CPPFLAGS="$CPPFLAGS -I/usr/include/CL"
И сразу после этого добавьте проверку заголовка:
AC_CHECK_HEADER([CL/cl2.hpp])
Шаг 3: Поддержка пользовательских флагов
Для того чтобы сделать процесс конфигурации более интуитивным для пользователя, вы можете добавить поддержку пользовательских флагов через аргументы командной строки. Например, в configure.ac
добавьте код, который будет устанавливать значения по умолчанию для переменных, если они не были заданы:
AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])
CXXFLAGS="${CXXFLAGS-'-std=gnu++11'}"
Шаг 4: Создание конфигурационного скрипта
Не забудьте выполнить команду для переработки скрипта конфигурации:
autoreconf -i
И затем запустите ./configure
:
./configure
Заключение
Следуя этим шагам, вы сможете без проблем передавать необходимые флаги компилятора для проверки заголовков, не требуя от пользователя ручной настройки переменной CXXCPP
. Это обеспечит более удобный и профессиональный подход к процессу сборки вашего проекта. Если у вас возникнут дополнительные вопросы или сложности, всегда рекомендуется проверять файл config.log
для получения детальной информации об ошибках, которые могут возникнуть во время конфигурации.