簡體   English   中英

使庫具有多個類,其他預先存在的.a庫和其他依賴項

[英]Making library with multiple classes, additional pre-existing .a library and other dependencies

我已經在一個名為“ LidarPathMapping ”的類中使用了幾個類。 我已經有2天時間尋找一個解決方案,讓一個人可以在他的代碼中包含該類並使用它。 我不希望他需要包含LidarPathMapping所依賴的其他類以及我編譯用於測試代碼的驅動程序的所有其他依賴項。 我的代碼還依賴於一個名為librplidar_sdk.a的庫和另一個名為PIGPIO的庫(它在一個覆盆子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.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 $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM