我正在尝试使用我编写的库编译一个简单的测试应用程序。这在其他机器上编译并运行良好。
我在/ usr / lib上有libroller.so。我正在编译一个main.cpp:
g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o
它抱怨了许多错误,例如:
/....../main.cpp:51: undefined reference to `Log::i(char const*, ...)'
但是,我知道这些存在于此:
nm -Ca /usr/lib/libroller.so | grep "Log::i"
00000000001f5d50 T Log::i(char const*, ...)
0000000000149530 W Log::i(std::string const&)
两者都是64位:
file /usr/lib/libroller.so
/usr/lib/libroller.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
file main.o
main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
与GCC and ld can't find exported symbols...but they're there!不同,我很确定这些符号是定义的。同样的.so使用一些相同的符号与另一个一起工作。
编辑/答案:对象的顺序很重要。在库之前放置main.o是必要的。我猜测链接器没有未解决的符号要处理,直到它到达main.o - 这是其列表中的最后一个对象。我仍然有点困惑,为什么这个在其他机器上工作了好几个月...
答案 0 :(得分:3)
变化:
g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o
为:
g++ -g3 -Wall main.o -lroller -lrt -o rap
链接顺序很重要(在这种情况下,-I
是多余的。)
答案 1 :(得分:1)
考虑更改库和main.o的序列:
g++ -g3 -Wall -I"../../" -o rap main.o -lrt -lroller
看一下这篇文章:Why does the order in which libraries are linked sometimes cause errors in GCC?
答案 2 :(得分:1)