When compiling C++ programs, glibc's include directory takes precedence over gcc's for standard C headers like math.h, but glibc's headers aren't completely compatible with C++. For example, isnan from math.h is supposed to be a function, but glibc defines it as a macro.
This program demonstrates the problem: #include <math.h> int main(void) { int isnan(0); return isnan; } It works as expected when gcc's built-in C++ headers are used, but not if glibc is installed: % guix environment --pure --ad-hoc gcc -- g++ -E isnan.cpp | tail -n1 int main (void) { int isnan (0); return isnan; } % guix environment --pure --ad-hoc gcc glibc -- g++ -E isnan.cpp | tail -n1 int main (void) { int __builtin_isnan (0); return isnan; } As a temporary workaround, I'm using the following package as a replacement for glibc, to keep the glibc headers out of $CPATH. If it's installed along with gcc, ld-wrapper and binutils, the test program compiles without errors. (use-modules (guix) (gnu)) (use-package-modules base) (package (inherit glibc) (name "my-glibc") (arguments (substitute-keyword-arguments (package-arguments glibc) ((#:phases phases) `(modify-phases ,phases (add-after 'install 'move-include (lambda _ (rename-file (string-append %output "/include") (string-append %output "/include-glibc")) #t)))))))