关于C/C++头文件引起的编译问题

本文介绍了C++中`#include`指令的两种形式,即使用双引号和尖括号包含头文件的区别,以及在不同情况下如何正确引用自定义头文件和系统标准头文件。同时提到了一个实际编译错误,涉及flann和pcl库,原因在于头文件引用顺序导致的编译器路径查找冲突。
摘要由CSDN通过智能技术生成

在 C++ 中,#include 是用于包含头文件的预处理指令。头文件是包含函数声明、类定义、常量等的文件,通常以 .h.hpp 作为文件扩展名。

#include 可以使用两种形式来包含头文件:

  1. 使用双引号 ("):

    #include "CESO.h"
    

    当使用双引号括起头文件名时,编译器会首先在当前源文件所在目录中查找该头文件。如果找不到,则会继续在其他包含路径中查找。

  2. 使用尖括号 (<>):

    #include <CESO.h>
    

    当使用尖括号括起头文件名时,编译器会在系统的标准头文件目录中查找该头文件。这些标准目录通常是在编译器安装时设置好的。

因此,双引号表示相对路径或自定义头文件的包含,而尖括号表示系统标准头文件的包含。

当你需要包含自己编写的头文件时,通常使用双引号形式。例如,如果 CESO.h 和当前源文件位于同一目录下,你可以使用 #include "CESO.h" 来包含该头文件。如果你需要包含系统提供的头文件,例如 <iostream><vector> 等,你应该使用尖括号形式,如 #include <iostream>

需要注意的是,使用尖括号形式时,编译器只会在系统标准头文件目录中查找头文件,而不会在当前源文件所在目录中查找。如果你的头文件不在系统标准目录中,而是在自定义目录中,你可以通过设置编译器的包含路径来告诉编译器在哪里查找头文件。


以上是一些关于引用头文件时,使用双引号和尖括号的区别。
在实际操作中,建议先把尖括号的引用放前面,双引号的头文件放最后,今天再编译时遇到一个问题,如果先把双引号的头文件放前面,会导致statistical_outlier_removal中一个函数ambiguous,很奇怪,只要把顺序调整一下就可以成功编译。

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/common/transforms.h>
#include <pcl/filters/frustum_culling.h>

#include "CESO.h"
#include "generateMap.h"

...

报错如下:

In file included from /usr/include/flann/algorithms/all_indices.h:35:0,
                 from /usr/include/flann/flann.hpp:45,
                 from /usr/include/pcl-1.8/pcl/kdtree/flann.h:50,
                 from /usr/include/pcl-1.8/pcl/kdtree/kdtree_flann.h:45,
                 from /usr/include/pcl-1.8/pcl/search/kdtree.h:44,
                 from /usr/include/pcl-1.8/pcl/search/pcl_search.h:44,
                 from /usr/include/pcl-1.8/pcl/filters/statistical_outlier_removal.h:44,
                 from /home/will/25omni_ws/src/gazebo_mobile_manipulator/src/find_closest_point/CESO_main.cpp:20:
/usr/include/flann/algorithms/nn_index.h: In member function ‘int flann::NNIndex<Distance>::knnSearch(const flann::Matrix<typename Distance::ElementType>&, flann::Matrix<int>&, flann::Matrix<typename Distance::ResultType>&, size_t, const flann::SearchParams&) const’:
/usr/include/flann/algorithms/nn_index.h:374:6: error: reference to ‘flann’ is ambiguous
      flann::Matrix<size_t> indices_(new size_t[indices.rows*indices.cols], indices.rows, indices.cols);

在自己写的两个头文件中添加的头文件如下:

  • CESO.h
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <limits>
#include <iostream>
#include <math.h>
#include <ctime>
  • generateMap.h
#include <iostream>
#include <opencv2/opencv.hpp>

有知道原因的大神,欢迎留言交流,感激不尽

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值