2016-05-28 5 views
0

Kürzlich habe ich versucht, dlib-Bibliothek zu meinem Projekt hinzuzufügen (ich interessiere mich für MPC-Teil, da ich es einen Quadrocopter steuern möchte), trotz vieler verschiedener Ansätze konnte ich keine richtige funktionierende Lösung finden. Ich habe eine Make-Datei wie folgt aus:Wie kompiliere ich dlib unter make mit mehreren Dateien?

all : quadro_mini 
CXXFLAGS = -std=c++11 -lpthread -O3 #-Wall -pedantic 
LIBRARIES = -IMPU6050 -LMPU6050 -IHCSR04 -LHCSR04 

OBJS = Steer.o Measurer.o LogWriter.o Server.o Functions.o Engine.o EnginesManager.o main.o 
HDRS = Server.h Measurer.h LogWriter.h Functions.h SteeringSignalsListener.h Engine.h EnginesManager.h Constants.h Steer.h 

$(OBJS) : $(HDRS) 

quadro_mini : $(OBJS) 
    g++ -pthread $^ $(LIBRARIES) -lMPU6050 -lHCSR04 -DLIB_NO_GUI_SUPPORT -o [email protected] 

Ich möchte Steer.o Modul enthält

Erster Ansatz
Verknüpfung DLIB verwenden, um alle

notwendig umfasst
OBJS = Measurer.o LogWriter.o Server.o Functions.o Engine.o EnginesManager.o main.o dlib/control.o #nazwy sie musza zgadzac z nazwami *.cpp i *.h 
HDRS = Server.h Measurer.h LogWriter.h Functions.h SteeringSignalsListener.h Engine.h EnginesManager.h Constants.h Steer.h 

$(OBJS) : $(HDRS) 

Steer.o : $(HDRS) 
    g++ $(CXXFLAGS) $^ $(LIBRARIES) -I. dlib/control.h -o [email protected] 
quadro_mini : $(OBJS) Steer.o 
    g++ -pthread $^ $(LIBRARIES) -lMPU6050 -lHCSR04 -DLIB_NO_GUI_SUPPORT -o [email protected] 

Die auf Kopf Ausgang, den ich erhalte:

In file included from dlib/control/../matrix/matrix_exp.h:6:0, 
      from dlib/control/../matrix/matrix.h:6, 
      from dlib/control/../matrix.h:6, 
      from dlib/control/approximate_linear_models.h:7, 
      from dlib/control/lspi.h:7, 
      from dlib/control.h:6, 
      from Steer.h:10: 
dlib/control/../matrix/../algs.h:146:9: error: expected identifier before numeric constant 
dlib/control/../matrix/../algs.h:146:9: error: expected '}' before numeric constant 
dlib/control/../matrix/../algs.h:146:9: error: expected unqualified-id before numeric constant 
dlib/control/../matrix/../algs.h:495:14: error: expected nested-name-specifier before 'disable_if_c' 
dlib/control/../matrix/../algs.h:495:26: error: expected initializer before '<' token 
dlib/control/../matrix/../algs.h:510:14: error: expected nested-name-specifier before 'enable_if_c' 
dlib/control/../matrix/../algs.h:510:25: error: expected initializer before '<' token 
dlib/control/../matrix/../algs.h:627:48: error: 'uint64' was not declared in this scope 
dlib/control/../matrix/../algs.h:627:48: note: suggested alternative: 

usw.

Zweite aproach:
Bibliothek Making of it out

all: dlib.a 

CXXFLAGS = -Wall -g -std=c++11 -pthread -DLIB_NO_GUI_SUPPORT 

dlib.o : control.h 
    g++ $(CXXFLAGS) -c $^ -o [email protected] 

dlib.a: dlib.o 
    ar -rv [email protected] $^ 

Aber da alles Header in DLIB ist dann welche Header soll ich angeben? Keine ... da die offizielle Seite es verbietet, sie dem Include-Pfad des Compilers hinzuzufügen. Dann funktioniert dieser Ansatz immer noch nicht ... nur für Info - kompilieren Artefakte über 60 mb.

dritte Ansatz
Hinzufügen der Ordner, der die DLIB Ordner enthält Suchpfad schließen und dann Verwendung umfassen Aussagen der Form # include (DLIB offizielle Erklärung).

CPLUS_INCLUDE_PATH=/home/linaro/Quadrocopter/dlib 
export CPLUS_INCLUDE_PATH 

Auch

CPLUS_INCLUDE_PATH=/home/linaro/Quadrocopter/ 
export CPLUS_INCLUDE_PATH 

Zuerst gibt:

/home/linaro/Quadrocopter/dlib/dlib_include_path_tutorial.txt:1:2: error: #error "Don't put the dlib folder in your include path" 

usw.
Zweite ähnliche Wirkung wie ersten Ansatz hat

Ich habe auch Test mit nur 2 bauen erstellt Kompilierungsartefakte:

all : test 
CXXFLAGS = -g -O3 -std=c++11 
LFLAGS = -lpthread -lnsl 

OBJS = maintest.o LogWriter.o 
HDRS = LogWriter.h Constants.h 

$(OBJS) : $(HDRS) 

test : $(OBJS) 
    g++ -pthread -Idlib/control.h $^ -o [email protected] 

Und das funktioniert! Aber es kann nicht mit meinem vorherigen Makefile

Wer bitte helfen Sie mir dabei? (Und kein -Ldlib arbeitet auch nicht)

Umwelt: Benutzerdefinierte Lubuntu, gcc Version 4.7.2, GNU Make 3,81

Antwort

1

uns in kleinen Schritten vorgehen lassen. Versuchen Sie dieses, und sagen Sie uns das Ergebnis:

HDRS = Server.h Measurer.h LogWriter.h Functions.h SteeringSignalsListener.h Engine.h EnginesManager.h Constants.h Steer.h 

Measurer.o : Measurer.cpp $(HDRS) 
    g++ $(CXXFLAGS) $< -I. -o [email protected] 
+0

Nachdem ich hinzufügen: Steer.o: Steer.cpp $ (HDRS) \t g ++ $ (CXXFLAGS) $ <-I. -o $ @ (ich glaube, du meintest Steer.o? nicht messor.o?). Ich erhalte das gleiche Ergebnis wie beim ersten Ansatz. – lagoru

+1

@Lagoru: Das ist interessant. Jetzt versuche, was ich vorgeschlagen habe. Und * füge * nicht hinzu. Versuchen Sie ein Makefile, das enthält, was ich oben geschrieben habe und nichts anderes. – Beta

+0

Nach zwei Wochen des Kampfes habe ich endlich eine Lösung gefunden - es war überhaupt nicht verbunden. In meinem letzten scheinbar sinnlosen Versuch, eine Lösung zu finden. Ich habe alles auf dem temporären System kopiert und gcc aktualisiert. Nachdem ich es normal verbunden und Build gestartet hatte, zeigte es mir, dass die globale Variable von dlib "TIMEOUT" im Konflikt mit meinem globalen #define TIMEOUT steht ..., gcc auf Lubuntu zeigt nur Unsinn, der überhaupt nicht mit dem Problem verbunden ist (mehrere tausend Zeilen) nicht mit Fallfehlern in Zusammenhang stehen). Danke trotzdem, da du der Einzige warst interessiert;) – lagoru