我试图让dlib库在我的c ++项目中运行,并且不知道如何处理我的Makefile和#include< ...>在我的脚本的头文件中。我已将头文件和脚本放在src目录中。已经对dlib库建立了符号链接,该链接位于include目录中(请参阅下面的文件夹结构)。
在dlib网站上说:
您不应将dlib文件夹本身添加到编译器的包含路径
相反,您应该将包含dlib文件夹的文件夹添加到包含搜索路径,然后使用#include形式的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是空的,因为我真的不知道如何处理它。
答案 0 :(得分:0)
文档说的是,您不能配置编译器,以便默认情况下找到dlib包含,但在项目中执行此操作。
这是有道理的,因此当您分发您的makefile时,它将适用于其他用户而无需更改编译器配置。
对于您的问题,只需更改
即可INC :=
通过
INC := -Iinclude/dlib
您将能够使用已添加到项目中的dlib标题:
#include <geometry.h>
(不添加路径,它已经在编译器搜索路径中,由-I
选项驱动)
有点超出了你的问题的范围,但是如果你使用dlib
库中的函数(不仅仅是定义),你会在链接阶段遇到类似的问题(被调用的dlib符号的未定义符号) 。这条线可能有所帮助,但我认为它也是可疑的:
LIB := $(shell find $(LIBDIR) -type f -name *.$(SRCEXT))
它在LIB中查找源文件(除非我弄错了,SRCEXT
不能包含库扩展名)