任何使用点云库 (PCL) 和 Makefile(不是 CMake)的人都可以帮助我解决错误。
我收到编译错误,表明编译器没有看到 PCL 路径。
在我的 main.cpp 文件中,我包含几个 PCL *.h 文件,例如#include
在我的 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$
提问时,请显示您输入的命令、生成的编译命令以及您遇到的错误,剪切并粘贴并格式化为代码块。
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 $@