根据https://www.gnu.org/software/gcc/gcc-11/porting_to.html#header-dep-changes,GCC 11 开始明确要求包括<limits>
, <memory>
, <utility>
,<thread>
与 Clang 12 相同或相似的故事(或更早,我不知道)。
由于我在使用(Node.js 的包管理器)时(经常)遇到此错误yarn
并且它每次都会覆盖所有源文件,因此我无法轻松添加:在编译过程中#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
请注意,*
仅当由 shell(bash、sh、zsh 等)或 makefile 使用时才有效。换句话说,gcc 和 clang 不注意*
文件路径,所以如果你使用ninja build
或直接从例如 C 程序向 gcc/clang 传递参数,请注意。
我有这个/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
,如果未应用更改,请重新启动 shell 或操作系统,或注销当前 tty,或切换到另一个 tty,或仅在终端中运行:
export CXXFLAGS="-g -pipe -march=native -mtune=native -Ofast -pipe -ftree-vectorize -fstack-protector-strong -include /usr/include/c++/11*/limits"
或者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 Busterdpkg-query -S /usr/include/stdlib.h
说它归libc6-dev:amd64
. Arch Linuxpacman -Qo /usr/include/stdlib.h
说它归glibc
. 因此,当软件包更新时,此 hack 将被覆盖,不要忘记。