对符号“_ZN5boost6system15system_categoryEv”的未定义引用

undefined reference to symbol '_ZN5boost6system15system_categoryEv'

我在 Whosebug 中找到的所有内容,对我的情况没有任何帮助,也许我的眼睛看不到某些东西?当我包含这些 headers #include <boost/log/expressions.hpp> 时,会出现对符号的未定义引用 #include <boost/log/utility/setup/file.hpp>

$ 回声 $LD_LIBRARY_PATH

/usr/lib/x86_64-linux-gnu/

PROGNAME := "program"
SOURCESWITHMAIN := $(wildcard src/*.cpp)
HEADERS := $(wildcard src/*.hpp)
HEADERS := $(patsubst src/%.hpp, inc/%.hpp, $(HEADERS))
SOURCES := $(patsubst main.cpp, , $(SOURCESWITHMAIN))
OBJECTS := $(patsubst src/%.cpp, obj/%.o, $(SOURCES))
DEPENDS := $(patsubst src/%.cpp, obj/%.dep, $(SOURCESWITHMAIN))

bin/PROGNAME: ./bin lib/libStat.a src/main.cpp $(HEADERS)
    @g++ -std=c++11 src/main.cpp -DBOOST_ALL_DYN_LINK -pthread -lboost_log -lboost_thread -lboost_system -lboost_log_setup -L lib -l Stat -o bin/$(PROGNAME) -I /inc -I /usr/include/boost/log/utility/setup
    @echo "Succesfully..."
inc/%.hpp: src/%.hpp ./inc
    @ln -f $< $@
./inc:
    @echo "inc folder created..."
    @mkdir -p inc
./bin:
    @mkdir -p bin
    @echo "bin folder created..."
lib/libStat.a: ./lib $(OBJECTS)
    @ar rc lib/libStat.a $(OBJECTS)
    @echo "static lib created..."
./lib:
    @mkdir -p lib
    @echo "lib folder created..."
obj/%.o: src/%.cpp
    @mkdir -p obj
    @g++ -std=c++11 -DBOOST_ALL_DYN_LINK -pthread -lboost_log -lboost_thread -lboost_system -lboost_log_setup -lboost_filesystem -c $< -o $@

obj/%.dep: src/%.cpp
    @mkdir -p obj
    @g++ -MM $< -MT "$@ $(patsubst %.dep, %.o, $@)" -o $@
-include $(DEPENDS)

.PHONY: clean
clean:
    @rm -rf bin/ lib/ obj/ inc/
    @echo "Cleaning..."

.PHONY: push
push:
    @git add .
    @git commit -m"some changes"
    @git push origin master

.PHONY: help
help:
    @echo "type make for compiling"
    @echo "type make clean for cleaning"
    @echo "type make push for fast pushing to repo"

天哪。你这里有很多问题。正如 Jesper 所说,linker 问题通常与 #include 文件无关。

首先,永远不要将库添加到编译行:即创建目标文件的行(使用 -c 编译器选项的行)。所以这个规则:

obj/%.o: src/%.cpp
        @mkdir -p obj
        @g++ -std=c++11 -DBOOST_ALL_DYN_LINK -pthread -lboost_log -lboost_thread -lboost_system -lboost_log_setup -lboost_filesystem -c $< -o $@

是错误的:您不应在此处有任何库选项(-l-L)。它应该只是:

obj/%.o: src/%.cpp
        @mkdir -p obj
        @g++ -std=c++11 -DBOOST_ALL_DYN_LINK -c $< -o $@

然而,所有这些都是无关紧要的,因为除了一个规则之外,实际上使用了这个 makefile 的 none:创建程序的规则。您创建了一堆从未使用过的变量,以及一堆曾经使用过的模式规则。

接下来,永远不要在 makefile 变量中使用引号,除非该变量包含需要引号的整个 shell 脚本。 Make 本身并不关心引号,它只是将它们与任何其他字符一样对待。所以,你应该使用:

PROGNAME := program

接下来你应该使用目标中的变量,否则它没有任何用处:

bin/$(PROGNAME): ./bin lib/libStat.a src/main.cpp $(HEADERS)

并且在你的食谱中你应该使用 $@ 来指代目标。

接下来link行列出库的顺序非常重要,一定是比较通用的库,以及它们所依赖的库之后。因此,例如,您的库 Stat 应该排在第一位,然后是 Boost 库,最后是系统库:

@g++ -std=c++11 src/main.cpp -DBOOST_ALL_DYN_LINK -pthread -L lib -l Stat -lboost_log -lboost_log_setup -lboost_thread -lboost_system -o bin/$(PROGNAME) -I /inc -I /usr/include/boost/log/utility/setup

注意你的-I选项是错误的;你写了 -I /inc 但你想要(我假设)-I ./inc.

我不知道你为什么要 link 将文件从源目录转移到包含目录。也许如果你修复了你的 -I 选项,你就不需要再这样做了。