对符号“_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
选项,你就不需要再这样做了。
我在 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
选项,你就不需要再这样做了。