【问题标题】:linker tells me it can't resolve symbols, but they're there?链接器告诉我它无法解析符号,但它们在那里?
【发布时间】:2012-01-13 00:09:48
【问题描述】:

我正在尝试使用我编写的库来编译一个简单的测试应用程序。这在其他机器上编译并运行良好。

我在 /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 之前没有要处理的未解析符号——这是它列表中的最后一个对象。我仍然有点困惑为什么这在其他机器上工作了好几个月......

【问题讨论】:

标签: gcc linker shared-libraries linker-errors


【解决方案1】:

变化:

g++ -g3 -Wall -I"../../" -lrt -lroller -o rap main.o

到:

g++ -g3 -Wall main.o -lroller -lrt -o rap 

链接顺序很重要(在这种情况下,-I 是多余的)。

【讨论】:

    【解决方案2】:

    考虑改变 library 和 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?

    【讨论】:

      【解决方案3】:

      您的问题是this one 的重复问题,答案相同:链接行matters 上的库顺序。

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        相关资源
        最近更新 更多