Canadian Cross libstdc++ build fails to find `max_align_t` unless GCC include path is manually added
coshvji cujmlqef
oyzawqgcfc@gmail.com
Mon Mar 16 08:41:22 GMT 2026
I would like to provide an additional observation related to the issue I previously reported about `max_align_t` not being found during a Canadian Cross libstdc++ build.
In my earlier message, I noted that the build succeeds only when I manually add:
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/gcc/include
However, I have now confirmed that the problem can also be resolved by **removing** the following two `-isystem` include paths:
-isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/include
-isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/sys-include
After removing these two `-isystem` directives, the build succeeds even without explicitly adding the GCC include directory.
This suggests that the use of `-isystem` for the target libc headers may be suppressing or overriding the expected include search order, preventing libstdc++ from seeing the GCC-provided `stddef.h` that defines `max_align_t`.
________________________________
From: coshvji cujmlqef <oyzawqgcfc@gmail.com>
Sent: Monday, March 16, 2026 16:37
To: libstdc++@gcc.gnu.org <libstdc++@gcc.gnu.org>
Subject: Canadian Cross libstdc++ build fails to find `max_align_t` unless GCC include path is manually added
Hello,
I am reporting an issue encountered when building libstdc++ in a Canadian Cross toolchain configuration. I would like to confirm whether this behavior is expected or if it indicates a missing include path during the build.
Some libc implementations (such as DJGPP’s libc) do not provide `max_align_t`. Normally this is not a problem, because GCC’s own headers (from libgcc, e.g. gcc/include/stddef.h) provide a definition of `max_align_t`. When using the newly built cross compiler directly, libstdc++ correctly picks up this header.
However, during a Canadian Cross build, libstdc++ is compiled using the host compiler, and it appears that the target GCC include directory:
$target/lib/gcc/$target/$version/include
is not added to the include search path. As a result, libstdc++ fails to see the `max_align_t` definition provided by libgcc, and the build fails with:
/home/test/toolchains_build/gcc/libstdc++-v3/include/cstddef:66:11: error: 'max_align_t' has not been declared in '::'
66 | using ::max_align_t;
| ^~~~~~~~~~~
Below is the failing command (paths unchanged except replacing the username as requested):
Failed command:
i586-msdosdjgpp-c++ -isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/include -isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/sys-include \
-x c++-header -nostdinc++ -g -O2 \
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/i586-msdosdjgpp/libstdc++-v3/include/i586-msdosdjgpp \
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/i586-msdosdjgpp/libstdc++-v3/include \
-I/home/test/toolchains_build/gcc/libstdc++-v3/libsupc++ \
-I/home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/include \
-O2 -g -std=gnu++0x \
/home/test/toolchains_build/gcc/libstdc++-v3/include/precompiled/stdc++.h \
-o i586-msdosdjgpp/bits/stdc++.h.gch/O2ggnu++0x.gch
The build succeeds if I manually add the GCC include directory:
Successful command (added GCC include path):
i586-msdosdjgpp-c++ -isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/include -isystem /home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/i586-msdosdjgpp/sys-include \
-x c++-header -nostdinc++ -g -O2 \
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/i586-msdosdjgpp/libstdc++-v3/include/i586-msdosdjgpp \
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/i586-msdosdjgpp/libstdc++-v3/include \
-I/home/test/toolchains_build/gcc/libstdc++-v3/libsupc++ \
-I/home/test/toolchains/gnu/x86_64-w64-mingw32/i586-msdosdjgpp/include \
-I/home/test/toolchains_build/toolchainbuildscripts/gcc/.artifacts/gcc/x86_64-w64-mingw32/i586-msdosdjgpp/gcc/gcc/include \
-O2 -g -std=gnu++0x \
/home/test/toolchains_build/gcc/libstdc++-v3/include/precompiled/stdc++.h \
-o i586-msdosdjgpp/bits/stdc++.h.gch/O2ggnu++0x.gch
Adding the `gcc/gcc/include` directory resolves the issue.
My question is:
Should the target GCC include directory (e.g. gcc/gcc/include or libgcc/include) be automatically added to the include path when building libstdc++ in a Canadian Cross environment?
If not, is there a recommended or officially supported way to ensure that libstdc++ can see the target GCC headers during a Canadian Cross build, especially for platforms whose libc does not provide `max_align_t`?
Thank you for your time. Any guidance on whether this is expected behavior or a configuration issue would be appreciated.
Best regards
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260316/cc9370f9/attachment.htm>
More information about the Libstdc++
mailing list