Как скомпилировать dlib под make с несколькими файлами?

Недавно я пытался добавить в свой проект библиотеку dlib (мне интересна часть MPC, так как я хочу, чтобы она управляла квадрокоптером), несмотря на множество различных подходов, я не смог найти подходящего рабочего решения. У меня есть makefile, как это:

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

Я хочу использовать dlib в модуле Steer.o

Первый подход
Ссылка на заголовок, содержащий все необходимые включения

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 $@
quadro_mini : $(OBJS) Steer.o
    g++ -pthread $^ $(LIBRARIES) -lMPU6050 -lHCSR04 -DLIB_NO_GUI_SUPPORT -o $@

Вывод, который я получаю:

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:

и т. д.

Второй подход:
сделать из него библиотеку

all: dlib.a

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

dlib.o : control.h
    g++ $(CXXFLAGS) -c $^ -o $@ 

dlib.a: dlib.o
    ar -rv $@ $^

Но поскольку все является заголовком в dlib, то какой заголовок я должен включить? Нет... так как официальная страница запрещает добавлять его в путь включения компилятора. Тогда этот подход все равно не работает... просто для информации - артефакты компиляции занимают более 60 мб.

Третий подход
Добавление папки, содержащей папку dlib, для включения пути поиска, а затем использование операторов включения в форме #include (официальное заявление dlib).

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

Также

CPLUS_INCLUDE_PATH=/home/linaro/Quadrocopter/
export CPLUS_INCLUDE_PATH

Первый дает:

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

и т. д.
Второй подход аналогичен первому подходу.

Я также создал тестовую сборку только с двумя артефактами компиляции:

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

И это работает! Но это невозможно с моим предыдущим make-файлом

Кто-нибудь, пожалуйста, помогите мне с этим? (и нет -Ldlib тоже не работает)

Среда: Custom Lubuntu, gcc версии 4.7.2, GNU Make 3.81


person lagoru    schedule 28.05.2016    source источник


Ответы (1)


Давайте двигаться небольшими шагами. Попробуйте это и сообщите нам результат:

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 $@
person Beta    schedule 28.05.2016
comment
После того, как я добавлю: Steer.o : Steer.cpp $(HDRS) g++ $(CXXFLAGS) $‹ -I. -o $@ (я думаю, вы имели в виду Steer.o ? не memer.o ?). Я получаю тот же результат, что и при первом подходе. - person lagoru; 29.05.2016
comment
@lagoru: Это интересно. А теперь попробуйте то, что я предложил. И не добавляйте. Попробуйте создать make-файл, содержащий то, что я написал выше, и ничего больше. - person Beta; 29.05.2016
comment
После двухнедельной борьбы с этим я, наконец, нашел решение - оно вообще не было связано с линковкой. В моей последней, казалось бы, бессмысленной попытке найти решение. Я скопировал все во временную систему и обновил gcc. После того, как я нормально слинковал его и начал сборку, он показал мне, что глобальная переменная dlib TIMEOUT конфликтует с моим глобальным #define TIMEOUT..., gcc на Lubuntu просто показывает мусор, вообще не связанный с проблемой (несколько тысяч строк не связанные с регистровыми ошибками). Тем не менее, спасибо, так как вы были единственным заинтересованным;) - person lagoru; 29.05.2016