彻底解决cmake编译过程中fatal error: OpenNI.h: 没有那个文件或目录

这篇具有很好参考价值的文章主要介绍了彻底解决cmake编译过程中fatal error: OpenNI.h: 没有那个文件或目录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境:ubuntu20.04

在cmake编译过程中,最常见的莫过于fatal error: xxxx.h: 没有那个文件或目录,这个问题困扰着很多初学者,原因是没有找到某个头文件,小白版的解决方法,直接把这个头文件的地址写进.cpp源文件或者把头文件地址写进 CMakeLists.txt INCLUDE_DIRECTORIES(头文件地址)。

用这个代码作例子,代码网址:

奥比中光 Astra Pro 一代(MX400)RGBD 摄像头 彩色RGB及深度采集_astra pro没有rgb图怎么办_China_JTJ的博客-CSDN博客

//test.cpp
#include <opencv2/opencv.hpp>
#include <sstream>
#include <fstream>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "OpenNI.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include<sys/stat.h>
#include<sys/types.h>

using namespace std;
using namespace cv;
using namespace openni;
 
void writeMatToXML(const std::string xmlName, const cv::Mat & mat)
{
    FileStorage fs(xmlName, FileStorage::WRITE);
    fs << "Mat" << mat;
    fs.release();
};

void CheckOpenNIError( Status result, string status )
{ 
	if( result != STATUS_OK ) 
		cerr << status << " Error: " << OpenNI::getExtendedError() << endl;
};
 
class ScenceNumber
{
    // use a file(number.txt) to recoder different scence
    public:

        int scNum;
        string fileName = "./data/number.txt";
        ScenceNumber()
        {
            ifstream f;
            f.open(this->fileName);
            if(f.good())
            {
                stringstream cvStr;
                string tmpStr;
                getline(f, tmpStr);
                cvStr << tmpStr;
                cvStr >> this->scNum;
                f.close();
            }
            else
            {
                ofstream f(this->fileName);
                f << "0" << endl;
                this->scNum = 0;
                f.close();
            }
        }
        string getNum()
        {
            ofstream f(this->fileName);
            stringstream cvStr;
            string tmpStr;
            this->scNum ++;
            cvStr << this->scNum;
            cvStr >> tmpStr;
            f << tmpStr << endl;
            f.close();
            cvStr >> tmpStr;
            return tmpStr;

        }
};

int main( int argc, char** argv )
{
	Status result = STATUS_OK;  
    ScenceNumber ScN;
    string baseFilePath = "./data";
    string filePath;
    char autoFlag = 0;
	//OpenNI2 image
	VideoFrameRef oniDepthImg;
    //VideoFrameRef oniColorImg;
 
	//OpenCV image
	cv::Mat cvDepthImg;
	cv::Mat cvBGRImg;
	cv::Mat cvFusionImg;
	
	cv::namedWindow("depth");
	cv::namedWindow("image");
	cv::namedWindow("fusion");
	char key=0;
 
	//【1】
	// initialize OpenNI2
    result = OpenNI::initialize();
	CheckOpenNIError( result, "initialize context" );  
 
	// open device  
	Device device;
    result = device.open( openni::ANY_DEVICE );

 
	//【2】
	// create depth stream 
    VideoStream oniDepthStream;
    result = oniDepthStream.create( device, openni::SENSOR_DEPTH );
 
	//【3】
	// set depth video mode
    VideoMode modeDepth;
    modeDepth.setResolution( 640, 480 );
    modeDepth.setFps( 30 );
    modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );
    oniDepthStream.setVideoMode(modeDepth);
	// start depth stream
    result = oniDepthStream.start();
 
	 create color stream
    VideoCapture capture;
    capture.open(0);
    capture.set(3, 640); //set the rgb size
    capture.set(4, 480);
	
//【4】
	set depth and color imge registration mode
	if( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )
	{
	device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );
	}
 

    long numInSc;
	while( key!=27 ) 
	{  
        if (key == 'g')
        {
            //generate the path
            if (not autoFlag)
            {
                filePath = baseFilePath + "/scence" + ScN.getNum();
                mkdir(filePath.c_str(), 0777);
                numInSc = 0;
                autoFlag = 1;
                cout << filePath << endl;
            }
        }
        if (key == 's')
        {
            //generate the path
            if (autoFlag)
            {
                numInSc = 0;
                autoFlag = 0;
                cout << "scence over" << endl;
            }
        }
		// read frame
		if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK )
		{
            capture >> cvBGRImg;
			cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() );
            
			cvRawImg16U.convertTo(cvDepthImg, CV_8U, 255.0/(oniDepthStream.getMaxPixelValue()));
            cv::flip(cvDepthImg, cvDepthImg, 1);
			//【5】
			// convert depth image GRAY to BGR
			cv::cvtColor(cvDepthImg,cvFusionImg,COLOR_GRAY2BGR);
			cv::imshow( "depth", cvDepthImg );
            cv::imshow( "image", cvBGRImg );
            if(autoFlag) //auto take photos
            {
                stringstream cvt;
                string SNumInSc;
                cvt << numInSc;
                cvt >> SNumInSc;
                writeMatToXML(filePath + "/" + SNumInSc + ".xml", cvRawImg16U);
                cv::imwrite(filePath + "/" + SNumInSc + ".jpg", cvBGRImg);
                cout << SNumInSc << " " << numInSc << "  saved" << endl;
                numInSc ++;
            }
		}
		//【6】
		cv::addWeighted(cvBGRImg,0.5,cvFusionImg,0.5,0,cvFusionImg);
		cv::imshow( "fusion", cvFusionImg );
		key = cv::waitKey(100);
	}
    //cv destroy
	cv::destroyWindow("depth");
	cv::destroyWindow("image");
	cv::destroyWindow("fusion");

    //OpenNI2 destroy
    oniDepthStream.destroy();
    capture.release();
    device.close();
    OpenNI::shutdown();

	return 0;
}

CMakeLists.txt

# cmake needs this line
cmake_minimum_required(VERSION 3.1)
 
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
 
# Define project name
project(data_capture)
 
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
INCLUDE_DIRECTORIES($ENV{OPENNI2_INCLUDE})
link_directories($ENV{OPENNI2_REDIST})
find_package(OpenCV REQUIRED)
 
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    config: ${OpenCV_DIR}")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "    include path: $ENV{OPENNI2_INCLUDE}")
 
# Declare the executable target built from your sources
add_executable(data_capture test.cpp)
 
# Link your application with OpenCV libraries
target_link_libraries(data_capture LINK_PRIVATE ${OpenCV_LIBS} libOpenNI2.so)

新建文件夹 test 把text.cpp ,CMakeLists.txt放入文件夹。把上面的代码复制进对应的文件。

mkdir test
cd test
touch test.cpp
touch CMakeLists.txt

编译

cd test
mkdir build
cd build
cmake ..
make

报错:

/home/m/cxx/OpenNI2_OpenCV/test.cpp:8:10: fatal error: OpenNI.h: 没有那个文件或目录
    8 | #include "OpenNI.h"
      |          ^~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/data_capture.dir/build.make:63:CMakeFiles/data_capture.dir/test.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:76:CMakeFiles/data_capture.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

这个错误说明找不到OpenNI.h这个头文件。虽然cmake找不到,但我们可以用find命令自己找。

sudo find / -name OpenNI.h

m@r:~$ sudo find / -name OpenNI.h
[sudo] m 的密码:
find: ‘/run/user/1000/doc’: 权限不够
find: ‘/run/user/1000/gvfs’: 权限不够
/usr/include/openni2/OpenNI.h
/home/m/OpenNI_v2.3.0.85_20220615_1b09bbfd_linux_x64_release/samples/samples/ThirdParty/OpenNI2/Include/OpenNI.h

find命令既然找到了头文件,解决这个错误有2个方法(只针对小白,大神勿扰):

方法1:

修改test.cpp源代码 include 直接连同目录导进来。

cmake找不到头文件,c++,开发语言

 在编译就不会提示找不到这个头文件了,所有找不到头文件的问题都可以用这个方法解决。

方法2:

CMakeLists.txt 内直接添加一行:INCLUDE_DIRECTORIES(/usr/include/openni2/)

cmake找不到头文件,c++,开发语言

 这样写就是告诉cmake,头文件直接到目录去找吧。

用上面2个方法中的一个,就可以彻底解决找不到头文件的问题,除非这个头文件根本在电脑内就不存在,那就是另外的问题了,需要的依赖项没有安装。

所有素材来自网络,如有侵权请告知本人删除。文章来源地址https://www.toymoban.com/news/detail-565078.html

到了这里,关于彻底解决cmake编译过程中fatal error: OpenNI.h: 没有那个文件或目录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译 FastDFS 时报错 fatal error: sf/sf_global.h: No such file or directory 解决办法

    编译 FastDFS 时,报错如下 原因: 需要先编译和安装 libserverframe,新引入的网络框架库,下载地址:https://github.com/happyfish100 编译安装完后即可正常编译安装 FastDFS

    2024年02月21日
    浏览(45)
  • fatal error: opencv/cv.h: 没有那个文件或目录 错误;fatal error: opencv2/contrib/contrib.hpp: 没有那个文件或目录,opencv多版本

    1,替换 将各文件中的 #include opencv/cv.h替换为 #include opencv2/opencv.hpp即可 2,noetic自带的是opencv4 另外,ORB SLAM要求OpenCV 3.0,noetic自带的是opencv4,编译仍会失败 3,fatal error: opencv2/contrib/contrib.hpp: 没有那个文件或目录 opencv3中已经没有了contrib这个模块,特别指出不是编译opencv_contrib的

    2023年04月08日
    浏览(41)
  • cpp文件编译过程 makefile cmake

    直接 gcc 没有-o 的话出来的输出exe文件没有调试信息,相比-o的大小会小一点,只有包含了调试信息文件才可以执行 头文件在编译器的include目录中,编译时 -I 指定库 函数库默认路径在编译器的lib目录中,编译时 -L指定目录,-l 小写L 指定库 函数或者是在别的c与cpp文件中 静态

    2024年02月08日
    浏览(37)
  • 使用cmake编译opencv过程中的可选参数说明

    opencv版本:4.5.5 通过源码编译opencv时,cmake可以带有很多可选参数,这里对这些可选参数进行说明。 配置选项可以通过几种不同的方式设置: 命令行:cmake-Doption=value… 初始缓存文件:cmake-C my_options.txt… 通过Cmake-GUI进行设定 在本参考中,我们将使用常规命令行。 最常用和有

    2024年02月16日
    浏览(49)
  • cmake与交叉编译(x86 to arm)过程和问题全记录

    公司维护一批c++动态库,由于生产需要,每次更新都要在windows、linux_x86、kylin_arm等多个环境中编译一遍,操作比较麻烦,所以想通过交叉编译的方式在一台机器上边编译多个环境的动态库,减少工作量。考虑到工作难度以及本人水平,决定从官方发布的成品交叉编译工具链中

    2024年04月28日
    浏览(46)
  • SpringBoot项目编译报错——Fatal error compiling:无效的标记: --release -> [Help 1]

    首先百度过之后知道要核查jdk版本。 加入以下代码。注:source和target要和引用的JDK统一版本,不然会报错。 主要错误如下所示: 淦!设置了一圈怎么报错还是不变,这时候已经过去2小时,快崩溃了。期间经历了clean、reload,依然报同一个错误。网上的各种方法都试了。版本

    2024年02月16日
    浏览(55)
  • 【OpenCV】features2d_converters.cpp:2:10: fatal error: common.h: 没有那个文件或目录

    Linux环境下使用opencv的dnn模块调用yolov4遇到的坑(纯CPU) Ubuntu安装opencv4.4,第一次编译完成安装成功,发现编译时少加了几个选项,于是重新编译,结果报如下错误 发现opencv_contrib-4.4.0/modules/xfeatures2d/test/下的features2d文件夹是在第一次编译中报错少了一个hpp文件才加进去的,

    2024年02月15日
    浏览(40)
  • >LINK : fatal error LNK1561和LINK : fatal error LNK1168:解决方法

    LINK : fatal error LNK1561和LINK : fatal error LNK1168:解决方法_fatal link error-CSDN博客 如果无法解决:只能试试在之前的项目中能否运行 这个错误提示表明在编译连接时,无法打开指定的可执行文件进行写入。这可能是由于以下原因之一导致的:1.该文件正在运行,因此无法写入;2.该文

    2024年02月06日
    浏览(42)
  • fatal error怎么解决,有什么快捷的解决方法

    fatal error怎么解决,其实是有多种的解决方法的,主要是看你想用哪种解决方法去进行解决,下面一起来看看。 一.fatal error的解决方法 1、按win+R,弹出运行窗口。 2、输入regedit点击确定,弹出注册表编辑器。 3、在注册表编辑器中依次找到“HKEY_CURRENT_USERSoftwareSteamPopCapPla

    2024年02月05日
    浏览(51)
  • Cmake:Error in configuration process,project files may be invalid.Qt编译opencv的经验之谈。

    Error in configuration process,project files may be invalid. 我这个是使用cmake来 编译opencv  +Qt。 Qt的这个路径 要放在环境变量的path中:E:Qt5Qt5.14.1Toolsmingw730_64bin 。 出错的原因是,没有按顺序操作Cmake界面按钮。 1.配置CMake编译条件 ①打开CMake(cmake-gui)。 ②选择OpenCV安装目录下的源码文

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包