使库具有多个类,其他预先存在的.a库和其他依赖项

时间:2017-04-28 08:23:15

标签: c++ c makefile shared-libraries static-libraries

我已经在一个名为" 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

1 个答案:

答案 0 :(得分:0)

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

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.cppbee.cppcrocket.cpp及其各自的头文件,每个包含一些类,其中一些依赖于彼此。现在,我想将它们组合到一个共享库libInsect.so中,并使用相关的头文件Insect.h,并构建一个使用它的可执行文件bughunt

Insect.h很简单:

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

现在为makefile:

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 $@