gpt4 book ai didi

c++ - 使用多个类、额外的预先存在的 .a 库和其他依赖项制作库

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:49 26 4
gpt4 key购买 nike

我已经完成了几个类,我在名为“LidarPathMapping”的类中使用了这些类。我已经花了 2 天时间寻找一种解决方案,使一个人可以在他的代码中包含该类并使用它。我不希望他需要包含 LidarPathMapping 依赖的其他类以及我用来编译驱动程序以测试我的代码的所有其他依赖项。我的代码还依赖于一个名为 librplidar_sdk.a 的库和另一个名为 PIGPIO 的库(它在 raspberry pi 中运行)。我希望想要使用我的代码的人只需要

#include "LidarPathMapping.h"

在他的代码中用类似的东西编译:

g++ main.cpp -L. -lLidarPathMapping

我不介意此人是否需要包含我正在使用的库(请参阅 make 文件),但需要包含我完成的每个类的每个对象会破坏目的。我对方法没有偏好,我只是想为想要使用它的人简化事情。如果有人能告诉我用户如何使用该库,我将不胜感激:如何包含在 .cpp 文件和 g++ 编译命令中。这是我编译驱动程序以测试我的代码的 makefile:

CFLAGS=  -w -Wall

LDIR= /home/pi/Documents/code/cpp/andar/andar/include

LIBS= -lboost_iostreams -lboost_system -lboost_filesystem \
-lrplidar_sdk -lstdc++ -lpthread -lpigpio -lrt -pthread \
-lGL -lGLU -lglut

#DEFS = -D USE_OPEN_GL
######################### Objects ###########################

OBJS = objects/LidarPlusServo.o \
objects/CloudManipulation.o \
objects/RoverParameters.o \
objects/csvReader.o \
objects/Dstar.o \
objects/LidarPathMapping.o \


######################### Headers ###########################

ANDARHEADERS = andar_include/LidarPlusServo.h \
andar_include/CloudManipulation.h \
andar_include/RoverParameters.h \
csvReader/csvReader.hpp \
include/Dstar.h \
andar_include/LidarPathMapping.h \

######################### Source Files ###########################
ANDARSRC = LidarPlusServo.cpp \
CloudManipulation.cpp \
RoverParameters.cpp \
csvReader/csvReader.cpp \
Dstar.cpp \
LidarPathMapping.cpp \


######################## Executable ##################################

#Change name here#
#If main file is called "helloWorld.cpp", write "helloWorld"

NAME = driverLidPathMap

$(NAME): $(OBJS) $(NAME).cpp
sudo g++ -std=c++11 $(CFLAGS) -o $(NAME) $(NAME).cpp $(OBJS) \
$(LIBS) -L$(LDIR)

####################### Create Objects ########################
objects/LidarPlusServo.o: LidarPlusServo.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) LidarPlusServo.cpp

objects/CloudManipulation.o: CloudManipulation.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) CloudManipulation.cpp

objects/RoverParameters.o: RoverParameters.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) RoverParameters.cpp

objects/csvReader.o: csvReader/csvReader.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) csvReader/csvReader.cpp

objects/Dstar.o: Dstar.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) Dstar.cpp

objects/LidarPathMapping.o: LidarPathMapping.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) LidarPathMapping.cpp

最佳答案

首先,这是一个有用的技巧。每个对象都有单独的规则:

objects/LidarPlusServo.o: LidarPlusServo.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) LidarPlusServo.cpp

objects/CloudManipulation.o: CloudManipulation.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) CloudManipulation.cpp

objects/RoverParameters.o: RoverParameters.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) RoverParameters.cpp

...

您正在使用自动变量 $@ , 但您也可以使用 $<对于先决条件列表中的第一个参数:

objects/LidarPlusServo.o: LidarPlusServo.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) $<

objects/CloudManipulation.o: CloudManipulation.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) $<

objects/RoverParameters.o: RoverParameters.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) $<

...

请注意所有这些规则都是相同的,除了目标和第一个先决条件,它们遵循一个简单的规则,objects/foo.o: foo.cpp。 .所以你可以用一个模式规则替换所有这些规则:

objects/%.o: %.cpp $(ANDARHEADERS)
sudo g++ -std=c++11 -c -o $@ $(CFLAGS) $<

现在构建和使用该库。我对源文件的内部结构了解不够,无法确切知道需要进行哪些更改,但我将举一个简单的示例来展示该技术.

假设我有三个源文件,ant.cpp , bee.cpp , crocket.cpp , 和各自的头文件, 各自包含一些类, 其中一些类相互依赖。现在我想将它们组合成一个共享库,libInsect.so ,带有相关的头文件,Insect.h ,并构建一个可执行文件 bughunt使用它。

Insect.h很简单:

#include "ant.h"
#include "bee.h"
#include "cricket.h"

现在是生成文件:

OBJECTS := ant.o bee.o cricket.o

%.o: %.cpp %.h
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -fPIC -c $< -o $@

libInsect.so: $(OBJECTS)
$(CXX) -fPIC -shared -o $@ $^

bughunt: bughunt.cpp libInsect.so
$(CXX) -L. $< -lInsect -o $@

关于c++ - 使用多个类、额外的预先存在的 .a 库和其他依赖项制作库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43675472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com