如果我没有放置-lboost_system标志,我会理解这个错误信息,但它确实在这里:
g++ -o build/myproject build/main/main.o -L/usr/local/boost/boost_1_52_0/boost/libs -L/usr/lib -Lbuild -L. -lboost_system -lboost_thread -lpthread -lboost_regex -lpq -lmylibrary build/libmylibrary.a(library.o): In function `__static_initialization_and_destruction_0(int, int)': library.cpp:(.text+0x25f): undefined reference to `boost::system::generic_category()' library.cpp:(.text+0x269): undefined reference to `boost::system::generic_category()' library.cpp:(.text+0x273): undefined reference to `boost::system::system_category()'
你知道我应该调查什么来解决这个问题吗?(我使用gcc 4.6.3)
我有几个"未定义的引用"(在链接期间)和"未解析的符号"(在dlopen之后的运行时)我工作的问题.它是一个相当大的makefile系统.
是否有一般规则和指南来链接库和使用编译器标志/选项来规避这些类型的错误?
我很难确定执行链接时要传递给g ++的标志。基本上,我用这些“标准”标志编译一些代码:
CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2
Run Code Online (Sandbox Code Playgroud)
然后,将生成的.o文件合并到几个静态库中,如下所示:
libxxx.a: xxx1.o xxx2.o ...
ar rcs $@ $^
libyyy.a: yyy1.o yyy2.o ...
ar rcs $@ $^
...
Run Code Online (Sandbox Code Playgroud)
问题:
-static编译.o文件时,是否需要在CXXFLAGS中使用该标志?创建静态库之后,我想将一些已编译的.o文件与这些库中的一些链接在一起,以构建可执行文件,因此我使用以下方法:
LINKER = g++
LIB_DIR = lib/linux
SYSTEM_LIBS = -lgmp
LDFLAGS = -Wall -L $(OUTPUT_DIR) -L $(LIB_DIR) $(SYSTEM_LIBS)
$(LINKER) $^ $(LDFLAGS) -lsvm -lUtils -lKinderedSpirits -o $@
exe:
$(LINKER) o1.o o2.o $(LDFLAGS) -lxxx -lyyy -lzzz -o $@
Run Code Online (Sandbox Code Playgroud)
问题:
-我应该在
- -static这里使用标志吗?-Wall在这里有意义吗?还是仅对编译有用?-是否需要将其他“标准”标志传递给链接器,类似于为编译器推荐的那些标志?
另外,在链接期间,它为我提供了有关GMP库中未定义引用的例外。据我所知,-lgmp发送到链接器并安装在系统上(我能够通过命令行使用GMP编译一个简单的hello世界),而libxxx.a libyyy.a libzzz.a是位于$(LIB_DIR)中。也许我应该提到libxxx.a中使用了GMP符号。
更新:
我设法修复了GMP符号的未定义引用。问题是由我放置库的顺序引起的。基本上,按规定 …