GCC 11 начал явно требовать включения <limits>
, <memory>
, <utility>
, <thread>
согласно https://www.gnu.org/software/gcc/gcc-11/porting_to.html#header-dep-changes
Такая же или похожая история с Clang 12 (или раньше, не знаю).
Поскольку я встречаю эту ошибку (часто) при использовании yarn
(менеджер пакетов для Node.js), и он каждый раз перезаписывает все исходные файлы, я не могу легко добавить #include <limits>
: мне нужно либо разветвить, либо спамить cp /tmp/fixedBad.h /installdir/bad.h
, пока идет компиляция.
Поэтому мое решение состоит в том, чтобы добавить в CXXFLAGS (не CFLAGS) следующее:
-include /usr/include/c++/11/limits
(Ubuntu 21.04, gcc 11.1.0)
-include /usr/include/c++/11.1.0/limits
(Arch Linux; та же версия, но путь отличается от Debian/Ubuntu)
или элегантно: -include /usr/include/c++/11*/limits
(*
работает из-за оболочки/make, а не из-за gcc/clang, поэтому будьте осторожны, если вы напрямую передаете аргументы в gcc/clang, например, из программы на C)
У меня это в /etc/environment
#CPPFLAGS="-D_FORTIFY_SOURCE=2 -DNDEBUG"
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong"
CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro"
RUSTFLAGS="-C target-cpu=native -C opt-level=2"
Проверьте echo $CXXFLAGS
, и если изменения не применяются, перезапустите оболочку или ОС, или выйдите из текущего tty, или переключитесь на другой tty, или просто запустите в терминале:
export CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
or set -a; source /etc/environment; set +a;
Я также пытался добавить в CXXFLAGS -include '<limits>'
и -include '<limits.h>'
, но пишет Нет такого файла или каталога
Также у меня есть другое решение (очень грязное):
Добавьте это в /usr/include/stdint.h
(или stdlib.h
или какой-нибудь другой популярный файл) перед последней строкой (#endif
):
#ifdef __cplusplus
extern "C++" {
#include <limits>
}
#endif
Ubuntu 21.04 и Debian Buster dpkg-query -S /usr/include/stdlib.h
говорят, что он принадлежит libc6-dev:amd64
. Arch Linux pacman -Qo /usr/include/stdlib.h
говорит, что он принадлежит glibc
. Так что этот хак будет перезаписан при обновлении пакета, не забывайте.
27.06.2021