编译OpenCV时出现错误,致命错误:stdlib.h:没有那个文件或目录。

35

我正试图编译OpenCV。我已经尝试了主分支(目前在提交dc9602e)和版本/标签3.1.0。我使用的是Fedora 24,首先尝试使用Fedora自带的gcc(gcc(GCC)6.2.1 20160916(Red Hat 6.2.1-2))。我还尝试了在我的机器上编译的GCC 6.2.0。

我正在使用以下参数的cmake:

cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_NEW_PYTHON_SUPPORT=ON -DINSTALL_PYTHON_EXAMPLES=ON -DWITH_TBB=ON -DWITH_V4L=ON -DINSTALL_C_EXAMPLES=ON -DBUILD_EXAMPLES=ON -DWITH_QT=ON -DWITH_OPENGL=ON -DWITH_OPENCL=ON -DWITH_EIGEN=ON -DWITH_OPENEXR=ON

cmake正常运行,然后我运行make。不管使用哪个OpenCV版本和gcc版本组合,结果都是相同的:

In file included from /usr/local/include/c++/6.2.0/bits/stl_algo.h:59:0,
                 from /usr/local/include/c++/6.2.0/algorithm:62,
                 from /home/dmelo/proj2/opencv/modules/core/include/opencv2/core/base.hpp:55,
                 from /home/dmelo/proj2/opencv/modules/core/include/opencv2/core.hpp:54,
                 from /home/dmelo/proj2/opencv/modules/highgui/include/opencv2/highgui.hpp:46,
                 from /home/dmelo/proj2/opencv/build/modules/highgui/precomp.hpp:45:
/usr/local/include/c++/6.2.0/cstdlib:75:25: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
                         ^
compilation terminated.

还有其他人遇到这个问题吗?我该如何解决这个问题呢?


2
尝试禁用预编译头文件(如果您打开cmake-gui,变量很容易找到)。 - Antonio
3
好的,我可以为您提供翻译。以下是翻译的结果:它起作用了。在使用"cmake"命令时添加参数"-DENABLE_PRECOMPILED_HEADERS=OFF"就可以解决问题。请您将此作为答案发布,以便我能够将其标记为正确答案。 - Diogo Melo
如何做这个?我不明白。我是新手。这很紧急,请帮忙。谢谢。 - Harry Sharma
5个回答

65

尝试禁用预编译头文件,可以通过cmake-gui或使用命令行参数实现

-DENABLE_PRECOMPILED_HEADERS=OFF

2
你可以使用cmake来构建OpenCV。在命令行中,添加答案中描述的参数:cmake -DENABLE_PRECOMPILED_HEADERS=OFF - Diogo Melo
这是对我有效的命令:cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_CUDNN=ON -D WITH_CUBLAS=ON -D WITH_TBB=ON -D OPENCV_DNN_CUDA=ON -D OPENCV_ENABLE_NONFREE=ON -D CUDA_ARCH_BIN=6.1 -D OPENCV_EXTRA_MODULES_PATH=$HOME/opencv_contrib/modules -D BUILD_EXAMPLES=OFF -D HAVE_opencv_python3=ON -DENABLE_PRECOMPILED_HEADERS=OFF -DCUDA_NVCC_FLAGS=--expt-relaxed-constexpr .. - Murad Popattia

8

使用zip包(opencv-2.4.11)进行编译对我来说没有效果,但从github仓库获取的最新版本成功编译了ubuntu 17.04。

git clone https://github.com/opencv/opencv.git
cd opencv
mkdir mybin
cd mybin
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLE_PRECOMPILED_HEADERS=OFF -DWITH_FFMPEG=OFF ..
make
sudo make install

更新:git clone之后,您可能希望执行git checkout 3.4,因为自从我写这篇文章以来,主分支已经有许多新变化。

注意:ffmpeg已过时和可选,因此我使用了WITH_FFMPEG=OFF标志。
更新:我可以在18.04上使用ffmpeg构建,使用了WITH_FFMPEG=ON标志。最新的ffmpeg也应该可以与17.04一起使用。如果您成功了,请在下面评论!

*OpenCV提交ID cca99bf8249387da9f79be8d549b2d49e39a0289

其他信息: 在编译之前安装的依赖关系-

build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libavcodec-dev libavformat-dev libswscale-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libtbb2 libtbb-dev

希望这个对未来的某些人有所帮助!

4
对于像Manjaro这样的Arch Linux发行版,使用标志-D ENABLE_PRECOMPILED_HEADERS=OFF-D CMAKE_NO_SYSTEM_FROM_IMPORTED=ON可以成功解决问题。
我在编译过程中也遇到了blascblas的问题。我通过添加CMAKE_EXE_LINKER_FLAGS=-lcblas来连接cblas

4

我使用的是Manjaro Linux操作系统,在我的系统中存在一个问题,原因是TBBConfig.cmake文件,它是Intel-TBB库的一部分,包含对include文件夹路径的修改,位于第56行:

set_target_properties(TBB::${_tbb_component} PROPERTIES
                                  INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/../../../include")

虽然在我的情况下-DENABLE_PRECOMPILED_HEADERS=OFF已经关闭了,但并没有解决问题,看起来这个标志-DCMAKE_NO_SYSTEM_FROM_IMPORTED=ON可以解决它。


3

对我来说,这是:

[ 33%] Building CXX object 
/home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/bin/x86_64-w64-mingw32-g++    @CMakeFiles/Transform360.dir/includes_CXX.rsp -std=c++11  -O3 -DNDEBUG   -o CMakeFiles/Transform360.dir/Library/VideoFrameTransform.cpp.obj -c /home/rdp/ffmpeg-windows-build-helpers/sandbox/win64/transform360_git/Transform360/Library/VideoFrameTransform.cppCMakeFiles/Transform360.dir/Library/VideoFrameTransform.cpp.obj
In file included from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/ext/string_conversions.h:41,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/bits/basic_string.h:6391,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/string:52,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/stdexcept:39,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/array:39,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/tuple:39,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/bits/stl_map.h:63,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/map:61,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/win64/transform360_git/Transform360/Library/VideoFrameTransform.h:18,
                 from /home/rdp/ffmpeg-windows-build-helpers/sandbox/win64/transform360_git/Transform360/Library/VideoFrameTransform.cpp:14:
/home/rdp/ffmpeg-windows-build-helpers/sandbox/cross_compilers/mingw-w64-x86_64/x86_64-w64-mingw32/include/c++/8.2.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>
               ^~~~~~~~~~
compilation terminated.

这里提到的是“编辑CMakeFiles/Transform360.dir/includes_CXX.rsp,将-isystem替换为-I”的提示,来源于此处


2
我遇到了类似的错误。令人沮丧的是,对于C++/cmake在这里所做的事情,对我来说没有清晰的逻辑路径。stdlib.h已经由glibc为我提供,那么为什么GCC通过C++想要使用自己的头文件,然后导致出现错误? - shevy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接