编译器错误 - 没有看到 PCL *.h 文件(使用 Makefile)

问题描述 投票:0回答:1

任何使用点云库 (PCL) 和 Makefile(不是 CMake)的人都可以帮助我解决错误。

我收到编译错误,表明编译器没有看到 PCL 路径。

在我的 main.cpp 文件中,我包含几个 PCL *.h 文件,例如#include 但是编译时出现此错误: src/main.cpp:35:10: fatal error: pcl/PCLPointCloud2.h: No such file or directory

在我的 Makefile 中(见下文),我使用“INCLUDES = -I/usr/include/pcl-1.13”包含 PCL 的路径
$(CXX) $(包括) $(CXXFLAGS) $< -o $@

*我不明白为什么编译器看不到 PCL .h 文件。我的 Makefile 是否未正确包含 PCL 路径?

我已仔细检查 PCL 的路径是否正确,确实如此。看截图:

这是我的 Makefile: (注意:我是 Makefile 新手)

CXX = g++
CXXFLAGS = -g -Wall -std=c++17 
INCLUDES = -Iinclude -I/usr/include/glm -I/usr/local/include/GLFW **-I/usr/include/pcl-1.13**
LFLAGS = -lGLEW -lGL -lGLU -lglfw -lXxf86vm -lXrandr -lpthread -lXi -ldl -lm -lXinerama -lXcursor -lrt -lX11 -L/usr/lib/x86_64-linux-gnu \
-llibpcl_apps -llibpcl_outofcore -llibpcl_people -lOpenNI -llibusb-1.0 -lOpenNI2 -llibpcl_surface -llibpcl_keypoints \
-llibpcl_tracking -llibpcl_recognition -llibpcl_registration -llibpcl_stereo -llibpcl_segmentation -llibpcl_features -llibpcl_filters \
-llibpcl_sample_consensus -llibpcl_ml -llibpcl_visualization -llibpcl_search -llibpcl_kdtree -llibpcl_io -llibpcl_octree -lpng -lz -lOpenNI \
-llibusb-1.0 -lOpenNI2

SRC = $(wildcard src/*.cpp) 
CFILES = $(wildcard src/*.c) 
SRCDIR = src
BUILDDIR = build
_OBJ = $(SRC:.cpp=.o) $(CFILES:.c=.o)
OBJ = $(patsubst $(SRC)/%,$(BUILDDIR)/%,$(_OBJ))
TARGET = main
TARGETPATH = $(BUILDDIR)/$(TARGET)


$(info OBJ is $(OBJ)) # print the value of the OBJ var to screen
build: $(OBJ) $(TARGET)

run:
    ./$(TARGET)

$(TARGET): $(OBJ)
    $(CXX) $(OBJ) -o $(TARGET) $(LFLAGS)


$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.c
    $(CXX) $(INCLUDES) $(CXXFLAGS) $< -o $@

clean:
    rm -f $(TARGETPATH)
    rm -f $(OBJ)

我在 Ubuntu 23.10 上将 VS Code 作为 IDE 运行。安装的PCL版本是1.13.0。我的代码是C++。

在我的 Makefile 中,我使用“INCLUDES = -I/usr/include/pcl-1.13”包含 PCL 的路径
$(CXX) $(包括) $(CXXFLAGS) $< -o $@

这是运行 make 的编译输出:

cxa@cxa-H5S2H:~/OpenGL/Zamani - OpenGL PCL$ make -B
OBJ is src/main.o src/PlyLoader.o src/glad.o
g++ -g -Wall -std=c++17    -c -o src/main.o src/main.cpp
src/main.cpp:35:10: fatal error: pcl/PCLPointCloud2.h: No such file or directory
   35 | #include <pcl/PCLPointCloud2.h> //for fromPCLPointCloud2()
  |              ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [<builtin>: src/main.o] Error 1
cxa@cxa-H5S2H:~/OpenGL/Zamani - OpenGL PCL$ 

我希望这足以让编译器找到我包含在 main.cpp 文件中的 *.h PCL 文件,例如#包括

改进的Makefile:

CXX = g++
CXXFLAGS = -g -Wall -std=c++17 
CFLAGS = -Iinclude
CPPFLAGS = -I/usr/include/pcl-1.13 -Iinclude -I/usr/include/glm -I/usr/local/include/GLFW
LFLAGS = -lGLEW -lGL -lGLU -lglfw -lXxf86vm -lXrandr -lpthread -lXi -ldl -lm -lXinerama -lXcursor -lrt -lX11 -L/usr/lib/x86_64-linux-gnu \
-llibpcl_apps -llibpcl_outofcore -llibpcl_people -lOpenNI -llibusb-1.0 -lOpenNI2 -llibpcl_surface -llibpcl_keypoints
#note: have deleted further (long list of) linked libraries to improve readability

#LDFLAGS = -lGLEW -lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi -ldl -lm -lXinerama -lXcursor -lrt

SRC = $(wildcard src/*.cpp) 
#SRC += $(wildcard common/*.cpp)
CFILES = $(wildcard src/*.c) 
#$(info SRC is $(SRC)) # print the value of the SRC var to screen
SRCDIR = src
BUILDDIR = build
_OBJ = $(SRC:.cpp=.o) $(CFILES:.c=.o)
OBJ = $(patsubst $(SRC)/%,$(BUILDDIR)/%,$(_OBJ))
TARGET = main
TARGETPATH = $(BUILDDIR)/$(TARGET)
#$(info TARGETPATH is $(TARGETPATH))


$(info OBJ is $(OBJ)) # print the value of the OBJ var to screen
build: $(OBJ) $(TARGET)

run:
    ./$(TARGET)

$(TARGET): $(OBJ)
    $(CXX) $(OBJ) -o $(TARGET) $(LFLAGS)


$(BUILDDIR)/%.o: $(SRCDIR)/%.c
    $(CXX) $(CXXFLAGS) $(CFLAGS) $< -o $@

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $< -o $@

clean:
    rm -f $(TARGETPATH)
    rm -f $(OBJ)

Makefile 编译输出以改进 Makefile:

cxa@cxa-H5S2H:~/OpenGL/Zamani - OpenGL PCL$ make -B
OBJ is src/main.o src/PlyLoader.o src/glad.o
g++ -g -Wall -std=c++17  -I/usr/include/pcl-1.13 -Iinclude -I/usr/include/glm -I/usr/local/include/GLFW  -c -o src/main.o src/main.cpp
In file included from /usr/include/pcl-1.13/pcl/PCLHeader.h:3,
                 from /usr/include/pcl-1.13/pcl/PCLPointCloud2.h:9,
                 from src/main.cpp:35:
/usr/include/pcl-1.13/pcl/memory.h:48:10: fatal error: Eigen/Core: No such file or directory
   48 | #include <Eigen/Core>  // for EIGEN_MAKE_ALIGNED_OPERATOR_NEW
      |          ^~~~~~~~~~~~
compilation terminated.
make: *** [<builtin>: src/main.o] Error 1
cxa@cxa-H5S2H:~/OpenGL/Zamani - OpenGL PCL$ 
makefile path pcl
1个回答
1
投票

提问时,请显示您输入的命令、生成的编译命令以及您遇到的错误,剪切并粘贴并格式化为代码块。

Make 将打印出它调用的命令。查看编译行 make 打印。您看到那里的

-I/usr/....
选项了吗?如果没有,那是你的问题。

这绝对是错误的:

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp $(SRCDIR)/%.c
       $(CXX) $(INCLUDES) $(CXXFLAGS) $< -o $@

这条规则告诉make它可以构建一个

.o
文件,但如果它找到both对应的
.cpp
.c
文件。因此,如果它可以同时找到
obj/foo.o
src/foo.cpp
,它只会使用此规则来构建
src/foo.c
,但几乎肯定不是这种情况,因此不使用此规则。

如果你有两个不同的源文件,你必须编写两个不同的规则:

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp
       $(CXX) $(INCLUDES) $(CXXFLAGS) $< -o $@

$(BUILDDIR)/%.o: $(SRCDIR)/%.c
       $(CC) $(INCLUDES) $(CFLAGS) $< -o $@
© www.soinside.com 2019 - 2024. All rights reserved.