Включить dlib в проект c++

Я пытаюсь заставить библиотеку dlib работать в моем проекте C++ и не знаю, что делать с моим Makefile и #include‹...> в заголовочном файле моего скрипта. Я поместил свой заголовочный файл и свой скрипт в каталог src. На библиотеку dlib сделана символическая ссылка, ссылка находится в директории include (см. структуру папок ниже).

На сайте dlib написано:

Вы не должны добавлять саму папку dlib в путь включения вашего компилятора.

Вместо этого вы должны добавить папку, содержащую папку dlib, в путь поиска включения, а затем использовать операторы включения в форме #include . Это гарантирует, что все построено правильно.

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

Структура папок такая:

    projectDir
    |-Makefile
    |-src
    | |-main.cpp
    | |-main.hpp
    |-include
      |-dlib (symbolic link)
        |-all
        |  |-source.cpp
        |- lots of header files
        |-...

Makefile выглядит так:

    CC      := g++ # This is the main compiler
    # CC := clang --analyze # and comment out the linker last line for sanity
    SRCDIR  := src
    LIBDIR  := lib
    BUILDDIR:= build
    TARGET  := bin/main

    SRCEXT  := cpp
    SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
    OBJECTS := $(patsubst$(SRCDIR)/%,$(BUILDDIR)                                                        /%,$(SOURCES:.$(SRCEXT)=.o))
    CFLAGS  := -g # -Wall
    LIB     := $(shell find $(LIBDIR) -type f -name *.$(SRCEXT))
    INC     :=

    $(TARGET): $(OBJECTS)
        @echo " Linking..."
        $(CC) $^ -o $(TARGET) $(LIB)

    $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
        @mkdir -p $(BUILDDIR)
        $(CC) $(CFLAGS) $(INC) -c -o $@ $<

    clean:
        @echo " Cleaning..."; 
        $(RM) -r $(BUILDDIR) $(TARGET)

    .PHONY: clean

Это файл main.cpp:

    #include "main.hpp"

    int main(){
        return 0;
    }

И заголовочный файл: main.hpp, пустой, так как я действительно не знаю, что с ним делать.


person user3346727    schedule 10.08.2016    source источник


Ответы (1)


В документации говорится, что вы не должны настраивать свой компилятор, чтобы он находил dlib по умолчанию, но делайте это в своем проекте.

В этом есть смысл, поэтому, когда вы распространяете свой make-файл, он будет работать для других пользователей без изменения конфигурации компилятора.

Для вашей проблемы просто измените

INC     :=

by

INC     := -Iinclude/dlib

Вы сможете использовать заголовки dlib, которые вы добавили в свой проект, следующим образом:

#include <geometry.h>

(не добавляйте путь, он уже находится в пути поиска компилятора, управляемом опцией -I)

Немного выходит за рамки вашего вопроса, но если вы используете функции из библиотеки dlib (не только определения), у вас будет аналогичная проблема на этапе ссылки (неопределенные символы для вызываемых символов dlib). Эта строка могла бы помочь, но я тоже думаю, что она подозрительна:

LIB     := $(shell find $(LIBDIR) -type f -name *.$(SRCEXT))

Ищет исходники в LIB (если не ошибаюсь, SRCEXT не может содержать расширения библиотек)

person Jean-François Fabre    schedule 10.08.2016
comment
Я изменил строку INC и прокомментировал строку LIB. #LIB := $(shell find $(LIBDIR) -type f -name *.$(SRCEXT)) INC := -Iinclude/dlib/ Также я добавил в свой заголовочный файл следующее: #include ‹../include/ dlib/geometry.h› Я не знаю, что вы имеете в виду под проблемой на этапе связывания? (это не делает без слов: Нет такого файла или каталога) - person user3346727; 10.08.2016
comment
проверьте мое редактирование и сообщите мне результаты. Если он компилируется и у вас есть проблема со ссылкой, опубликуйте это тоже. - person Jean-François Fabre; 10.08.2016
comment
Да, большое спасибо! Осталась только одна проблема, которую я решил. Проблема заключалась в том, что была включена папка dlib. Это неправильно (по крайней мере, для dlib) и дает ошибки. Теперь я сделал следующее: INC := -Iinclude/dlib и #include ‹dlib/geometry.h›. Это работает сейчас. Большое спасибо! - person user3346727; 10.08.2016