代码之家  ›  专栏  ›  技术社区  ›  Clay

GCC和LD找不到导出的符号……但它们就在那里。

  •  3
  • Clay  · 技术社区  · 16 年前

    我有一个C++库和一个C++应用程序,试图使用从库导出的函数和类。库构建良好,应用程序编译但无法链接。我得到的错误如下表所示:

    app source file.cpp:(.text+0x2fdb):未定义对“lib namespace::getstatusstr(int)”的引用

    库中的类似乎被链接器很好地解决了,但自由函数和导出的数据(如余弦查找表)总是会导致上述错误。

    我使用的是Ubuntu8.04(Hardy),它是最新的Ubuntu软件包。

    链接库的命令是(删除其他库后):

    g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
    

    链接应用程序的命令是(删除其他库后):

    g++ -fPIC -Wall -O3  -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
    

    最后,似乎(尽我所知)正在正确导出相关符号:

    nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   PiedPiper    16 年前

    NM输出中的u zn3lib-namespace12getstatusstrei之前的u表示符号为 未定义 在图书馆里。

    也许它是在错误的名称空间中定义的:看起来您是在lib名称空间中调用它,但您可能是在另一个名称空间中定义它。

        2
  •  2
  •   Christian.K    16 年前

    已经有一段时间了,但是如果您用-l选项指定了一个lib,那么您就没有跳过lib前缀吗?

    (我将名称从“lib in question.so”改为“libfoobar.so”,以便阅读下面的示例)

    g++ -fPIC -Wall -O3  -L~/project/lib/release -lfoobar
    

    g++ -fPIC -Wall -O3  ~/project/lib/release/libfoobar.so
    
    推荐文章