Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Problem with including cstdlib library (No such file or directory)



  • I've got problem with stdlib.h library in Qt Creator(QT version 5.12.8) on Linux(Ubuntu 20.04). I use some library for interval arithmetic(interval.h), which use quite a bunch of other libraries (as boost/lexical_cast.hpp and mpfr.h) therefore it take some to make it work... or at least it seems so.
    I fixed problem with this additional libraries I had to install by adding apropriate entry in my .pro file ("/usr/local/boost/boost_1_55_0" and "/usr/include" in INCLUDEPATH and corresponding entries in LIBS).
    But then I get the error "stdlib.h: No such file or directory", I tried to change "#include <stdlib.h>" into "#include <cstdlib>" (similar as I previously have to do with floats.h, so I thought it'll help) but it didn't change it. I still get the same error (and QT creator point to cstlib library itself since that).
    I've read here about deleting "/usr/include" from INCLUDEPATH, but this would undo my fix for mpfr(I needed it to eliminate compilation error connected to mpfr's function), so it's not an option.
    There is any other way to solve that?
    (Here is my entire project if that would help)


  • Lifetime Qt Champion

    Hi and welcome to devnet,

    Why not install the boost development packages from your distribution ?

    Your LIBS line is wrong, it should point to the path where the libraries can be found.

    I do not know whether you are using only header only stuff from boost but you are not linking to any of its libraries ?

    That said, which development packages did you install on your system ?



  • @SGaist what do You mean by installing packages from my distribution?
    I Installed both boost libraries and mpfr according to that guide. I use mpfr.h, which as far as I know isn't header only (or it seems so to me as I have to pre compile it, but maybe I get something wrong about this, I'm not a big expert in regard of how compilers work on the inside; but this one isn't from boost) and header only library "lexical_cast.hpp" from boost. Both in interval.h library.
    called lexical_cast.hpp. And as I checked in my filesystem "/usr/local" is where the mpfr.h file is located, and "/usr/local/boost/boost_1_55_0" is where "lexical_cast.hpp"(or more precisely "where boost/lexical_cast.hpp") is located. So how my LIBS line is wrong? As I found out when checking how to linking libraries in Qt on Linux the way to do it is adding -L"[location of the library]" in to the LIBS variable... if that isn't the correct way then what is the correct way?

    Also - the error I was getting was not (at least visibly) connected to boost libraries, but it was about stdlib.h in cstdlib.


  • Qt Champions 2019

    @Lyokoheros said in Problem with including cstdlib library (No such file or directory):

    what do You mean by installing packages from my distribution?

    apt install libboost-all-dev
    


  • @jsulm that didn't change anything. I still get the same error. Which was about stdlib.h, not boost libraries, as I already mentioned.


  • Lifetime Qt Champion

    @Lyokoheros said in Problem with including cstdlib library (No such file or directory):

    stdlib.h

    Where do you have that file exactly on your system ?



  • @SGaist i find it in a few differen locations:
    usr/include
    usr/include/c++/8
    usr/include/c++/9
    usr/include/x86_64-linux-gnu/bits
    snap/gnome-3-34-1804/36/usr/include
    usr/include/c++/8/tr1
    usr/include/c++/9/tr1


  • Lifetime Qt Champion

    Can you share your .pro file ?



  • @SGaist I already do it. .pro file is inside the repository i linked at the very beginning.

    QT += core gui widgets
    
    TARGET = BairstowSolver
    TEMPLATE = app
    CONFIG += \
    no_keywords
    
    SOURCES += \
        main.cpp \
        mywidget.cpp \
        solver.cpp \
        solverinterval.cpp
    
    HEADERS += \
        interval.h \
        mywidget.h \
        solver.h \
        solverinterval.h
    
    LIBS +=\
        -L"/usr/local/boost/boost_1_55_0" \
        -L"/usr/include"
    
    
    INCLUDEPATH +=\
        /usr/local/boost/boost_1_55_0 \
        /usr/include
    

    And here's direct link to it.


  • Qt Champions 2019

    @Lyokoheros said in Problem with including cstdlib library (No such file or directory):

    LIBS +=
    -L"/usr/local/boost/boost_1_55_0"
    -L"/usr/include"

    Why did you add /usr/include to search path for libraries?! Also, it is not needed to add it to include paths (INCLUDEPATH) as it is searched by default.



  • @jsulm I hade to add it to solve problem with Qt Creator not finding the mpfr.h library (I getttti error "undefined refference to 'mpfr_init2'")


  • Lifetime Qt Champion

    mpfr.h is a header which are usually found in an include subdir.

    "-L" is used to add paths to search for the linker to find additional libraries. Adding include path to it is usually wrong because if there are library files in there, then your system has an installation issue.

    Can you build a default project using that header ?



  • @SGaist well it was exaclty in that folder, not in any of subfolders.
    But well actually when I create new qt widget application it could be easily build with just -L"/usr/include" or just reffering to mpfr.h (simply by including it in class header) all was fine but when I tried to build it with both (-L"/usr/include" in LIBS and including mpfr.h) i got the same error: stdlib.h no such file or directory.
    Well at least that's what I saw at the beginning now when I tried to repeat this tests it seems random... sometimes with both it work well, sometimes without this addition to LIBS, sometimes only with it (and not including mpfr.h), other time it's not working just with addition to LIBS(without including mpfr.h)... i don't get it...

    But maybe the correct aproach to it would be solving the error, which appear when I don't add "-L"/usr/include"" to LIBS. And this is the said error:

    error: main.o: in function `interval_arithmetic::Interval<long double>::IntRead(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
    /home/ubuntu/Desktop/MetodaBairstowa/interval.h:264: error: undefined reference to `mpfr_init2'
    error: /home/ubuntu/Desktop/build-Bairstow-Desktop-Debug/../MetodaBairstowa/interval.h:265: undefined reference to `mpfr_set_str'
    error: /home/ubuntu/Desktop/build-Bairstow-Desktop-Debug/../MetodaBairstowa/interval.h:268: undefined reference to `mpfr_get_ld'
    error: /home/ubuntu/Desktop/build-Bairstow-Desktop-Debug/../MetodaBairstowa/interval.h:271: undefined reference to `mpfr_get_d'
    [and a little bit of similar lines]
    

  • Lifetime Qt Champion

    Where is the .so file of that library located ?



  • @SGaist .so file of what library? (I know this may seem a stupid question, but before I didn't work much with additional external libraries in c++)


  • Qt Champions 2019

    @Lyokoheros said in Problem with including cstdlib library (No such file or directory):

    so file of what library?

    The library which defines the undefined references. I guess libmpfr.so or something like that...



  • @jsulm I find it in usr/lib/x86_64-linux-gnu, but there is also one in home/ubunutu/anaconda3/lib and a few instances with something like ".6" or ".6.0.2" after the ".so" extension (I know linux technically doesn't have extensions, but I don't know how to call it other way)


  • Qt Champions 2019

    @Lyokoheros

    LIBS += -lmpfr
    

    in PRO file should be enough



  • @jsulm apparently it wasn't enough.
    And actually it turned out I forget implement the interval version of one function, which of course give me some errors after adding -lmpfr to LIBS, but after adding the mentioned implementation I again get just "stdlib.h: No such file or directory" - which point to cstdlib in /usr/include/c++/9/

    The .pro file is now like this:

    QT += core gui widgets
    
    TARGET = BairstowSolver
    TEMPLATE = app
    CONFIG += \
    no_keywords
    
    SOURCES += \
        main.cpp \
        mywidget.cpp \
        solver.cpp \
        solverinterval.cpp
    
    HEADERS += \
        interval.h \
        mywidget.h \
        solver.h \
        solverinterval.h
    
    LIBS +=\
        -L"/usr/local/boost/boost_1_55_0" \
        -lmpfr
    
    
    INCLUDEPATH +=\
        /usr/local/boost/boost_1_55_0 \
        /usr/include
    

    For changes in intervalsolver.cpp you can look here


  • Lifetime Qt Champion

    Nothing stands out...

    Do you have the same issue if you use a default project ?



  • Could you please provide the compiler output before and after the "stdlib.h: No such file or directory"? Usually there is more information like "included from..." so that you can figure out the whole chain of includes.
    As a "shot in the dark" , issues which may create problems like yours could be:

    • case sensitive include paths somewhere in your include tree (especially dangerous if you use libs which where developed on Windows)

    • something you you include uses absolute include paths (bad practice, should not happen in the libs you mentioned)

    • something you you include uses relative include paths for standard headers (also bad practice but ...)

    btw, if you need something like -L"/usr/include" to make it work, I would be very wary. Adding an include dir for the linker makes no sense at all, as SGaist and jsulm explained above.


Log in to reply