未定义对符号"_ZN5boost6system15system_categoryEv "的引用。

问题描述 投票:0回答:1

我在Stackoverflow找到的所有资料,对我的情况没有任何帮助,也许有什么东西是我的眼睛看不到的?#include <boost/log/expressions.hpp>#include <boost/log/utility/setup/file.hpp>

$ echo $LD_LIBRARY_PATH

usrlibx86_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"
c++ boost makefile boost-log
1个回答
1
投票

哦,我的天。 你这里有很多问题。 正如Jesper所言,链接器的问题通常与以下问题无关 #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中没有任何一条规则被实际使用: 创建程序的那条规则。 你创建了一堆从未被使用过的变量,以及一堆曾经被使用过的模式规则。

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

PROGNAME := program

接下来你应该在目标中使用这个变量,否则它就没有意义了。

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

而在你的配方中,你应该使用 $@ 来引用目标。

其次,链接线上的库的排列顺序至关重要,必须是比较通用的库 第一以及它们所依赖的图书馆 之后. 例如,你的图书馆 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.

我不知道为什么你要把文件从源目录链接到include目录。 也许如果你把你的 -I 选项,你就不需要再这样做了。

© www.soinside.com 2019 - 2024. All rights reserved.