Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fatal error: stdlib.h: No such file or directory from #include_next <stdlib.h> #2706

Open
mattpulver opened this issue Apr 2, 2024 · 2 comments

Comments

@mattpulver
Copy link
Contributor

Describe the bug
Fatal error when building:

In file included from /usr/include/c++/13.2.1/bits/stl_algo.h:71,
                 from /usr/include/c++/13.2.1/algorithm:61,
                 from cpp/oneapi/dal/algo/logistic_regression/parameters/cpu/train_parameters.cpp:17:
/usr/include/c++/13.2.1/cstdlib:79:15: fatal error: stdlib.h: No such file or directory
   79 | #include_next <stdlib.h>
      |               ^~~~~~~~~~
compilation terminated.

To Reproduce
Steps to reproduce the behavior:

cd src/oneDAL-2024.1.0
./dev/download_micromkl.sh

LIBRARY_PATH=/usr/lib \
LD_LIBRARY_PATH=/usr/lib \
TBBROOT=/usr \
  make -f makefile daal oneapi_c -j10 COMPILER=gnu PLAT=lnx32e REQCPU="avx2 avx512"

Expected behavior
It should build successfully

Diagnosis and Fix
The problem first occurs at this step:

g++ -m64 -fwrapv -fno-strict-overflow -fno-delete-null-pointer-checks -Werror -Wreturn-type -Wno-error=dangling-reference  -c -Wformat -Wformat-security -O2 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fPIC -std=c++17   -DTBB_SUPPRESS_DEPRECATED_MESSAGES -D__TBB_LEGACY_MODE  -pedantic -Wall -Wextra -Wno-unused-parameter -DDAAL_NOTHROW_EXCEPTIONS -DDAAL_HIDE_DEPRECATED -D_ENABLE_ATOMIC_ALIGNMENT_FIX  -D__ONEDAL_ENABLE_DLL_EXPORT__ -D__TBB_NO_IMPLICIT_LINKAGE -DTBB_USE_ASSERT=0 @./__work_gnu/md/lnx32e/oneapi_dynamic/inc_y_folders.txt   -MMD -MT __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o -MF __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.d.tmp -o__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o cpp/oneapi/dal/algo/logistic_regression/parameters/cpu/train_parameters.cpp &&  sed -n -i -e ':beg' -e '/\\$/N; s/\\\n/ /; tbeg' -e ' s@cpp/oneapi/dal/algo/logistic_regression/parameters/cpu/train_parameters.cpp\( \|$\)@@; s/  */ /g; s/^.*: *$//;' -e 's@ /[^ ][^ ]*@ @g; s/^.*: *$//;' -e '/./{ p; s/^.*://; s/^ *//; /./{ s/ *$/:/; s/  */:\n/g; p; };}' __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.d.tmp && printf '\n%s\n' '__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.mkdeps += makefile dev/make/cmplr.gnu.mkl.mk dev/make/cmplr.dpcpp.mk dev/make/common.mk dev/make/deps.mk dev/make/deps.mkl.mk makefile.ver' '$(__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.mkdeps):' '__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o: $(__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.mkdeps)' '__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.trigger = g++ -m64 -fwrapv -fno-strict-overflow -fno-delete-null-pointer-checks -Werror -Wreturn-type -Wno-error=dangling-reference  -c -Wformat -Wformat-security -O2 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fPIC -std=c++17   -DTBB_SUPPRESS_DEPRECATED_MESSAGES -D__TBB_LEGACY_MODE  -pedantic -Wall -Wextra -Wno-unused-parameter -DDAAL_NOTHROW_EXCEPTIONS -DDAAL_HIDE_DEPRECATED -D_ENABLE_ATOMIC_ALIGNMENT_FIX  -D__ONEDAL_ENABLE_DLL_EXPORT__ -D__TBB_NO_IMPLICIT_LINKAGE -DTBB_USE_ASSERT=0 @./__work_gnu/md/lnx32e/oneapi_dynamic/inc_y_folders.txt   -o__work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o cpp/oneapi/dal/algo/logistic_regression/parameters/cpu/train_parameters.cpp' >> __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.d.tmp && mv -f __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.d.tmp __work_gnu/md/lnx32e/oneapi_dynamic/cpp-oneapi-dal-algo-logistic_regression-parameters-cpu-train_parameters.o.d

which results in the above fatal error. We can see the reason for this by adding -v to the g++ command. It reports:

#include "..." search starts here:
#include <...> search starts here:
./cpp
./__release_lnx_gnu/daal/latest/include
./cpp/daal
./__work_gnu/md/lnx32e
./__deps/mklfpk/include
./__deps/mklfpk/lnx/include
 ./__deps/mklgpufpk/lnx/include
 /usr/include/tbb
 /usr/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1/x86_64-pc-linux-gnu
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1/backward
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/include-fixed
End of search list.

From the error message:

/usr/include/c++/13.2.1/cstdlib:79:15: fatal error: stdlib.h: No such file or directory
   79 | #include_next <stdlib.h>
      |               ^~~~~~~~~~

In context, that line in /usr/include/c++/13.2.1/cstdlib is:

// Need to ensure this finds the C library's <stdlib.h> not a libstdc++
// wrapper that might already be installed later in the include search path.
#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
#include_next <stdlib.h>
#undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS

What should happen is that stdlib.h is included from /usr/include. However since /usr/include precedes /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../include/c++/13.2.1 in the above #include <...> search paths, it doesn't find it, resulting in the error.

The source of how these #include <...> search paths got mixed up is from @./__work_gnu/md/lnx32e/oneapi_dynamic/inc_y_folders.txt which is in the above g++ command:

cat __work_gnu/md/lnx32e/oneapi_dynamic/inc_y_folders.txt
-I./cpp -isystem./__release_lnx_gnu/daal/latest/include -isystem./cpp/daal -isystem./__work_gnu/md/lnx32e -isystem./__deps/mklfpk/include -isystem./__deps/mklfpk/lnx/include -isystem./__deps/mklgpufpk/lnx/include -isystem/usr/include/tbb -isystem/usr/include

Note the last parameter -isystem/usr/include. By simply excluding this from the inc_a_folders.txt and inc_y_folders.txt generated files fixes the problem. Making this change results in /usr/include coming correctly after /usr/include/c++/13.2.1 in the #include <...> search paths.

Environment:

  • OS: Arch Linux (2024 April 2)
  • Compiler: gcc (GCC) 13.2.1 20230801
  • Version: 2024.1.0
@syakov-intel
Copy link

Hello @mattpulver ,

We've tried to reproduce the issue with all the software versions as reported except Arch Linux though with no luck. Did you have any progress on your side meanwhile?

@mattpulver
Copy link
Contributor Author

Yes I'm able to get through this by adding

  awk '{print} /\(ONEAPI\.include_options\)/{print "\tsed -i \x27s# -isystem/usr/include$$##\x27 $@"}' \
      makefile > makefile.tmp && mv makefile.tmp makefile

to the prepare() step in the PKGBUILD file.

I haven't tracked down where the /usr/include entry is coming from that appears in the intermediate inc_[ay]_folders.txt files but I think this would be fixed if they were omitted. I'm not sure why they need to be included, as they seem to mess up

#include_next <stdlib.h>

in cstdlib: https://github.com/gcc-mirror/gcc/blob/cacc55a4c0be8d0bc7417b6a28924eadbbe428e3/libstdc%2B%2B-v3/include/c_global/cstdlib#L79

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants