我正在使用Eclipse-CDT在Ubuntu x64上设置一个C++项目。我基本上是在打个招呼,并连接到商业的3rd Party库。

我已经包含了链接到其库的头文件,但是仍然出现链接器错误。除了明显的问题以外,这里还有其他可能的问题吗(例如,我99%确信我正在链接到正确的库)。

  • 是否可以确认我链接到的静态库是64位的?
  • 是否可以确认该库具有我期望的类(和方法)?

  • Eclipse说:

    建立目标:LinkProblem
    调用:GCC C++链接器
    g++ -L/home/notroot/workspace/somelib-3/somelib/target/bin -o“LinkProblem” ./src/LinkProblem.o -lsomelib1 -lpthread -lsomelib2 -lsomelib3
    ./src/LinkProblem.o:在“main”函数中:
    /home/notroot/workspace/LinkProblem/Debug/../src/LinkProblem.cpp:17:对`SomeClass::close()的 undefined reference
    ./src/LinkProblem.o:在函数“SomeOtherClass”中:
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148:对`SomeClass::SomeClass()的 undefined reference
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:148:对`vtable for SomeOtherClass'的 undefined reference
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:151:对`SomeClass::〜SomeClass()'的 undefined reference
    ./src/LinkProblem.o:在`〜SomeOtherClass'函数中:
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:未定义对`vtable for SomeOtherClass'的引用
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:对`SomeClass::〜SomeClass()'的 undefined reference
    /home/notroot/workspace/somelib-3/somelib/include/sql/somefile.h:140:对`SomeClass::〜SomeClass()'的 undefined reference
    collect2:ld返回1退出状态
    make:*** [LinkProblem]错误1

    最佳答案

    假设这些方法在其中一个库中,则看起来像是一个排序问题。

    将库链接到可执行文件时,它们按声明的顺序完成。
    同样,链接器将仅采用解决当前 Unresolved 依赖关系所需的方法/功能。如果随后的库随后使用对象最初不要求的方法/功能,则将缺少依赖项。

    这个怎么运作:

  • 提取所有目标文件并将它们组合成可执行的
  • 解决对象文件之间的所有依赖关系。
  • 每个库的顺序为:
  • 检查未解析的依赖项,并查看lib是否解析了它们。
  • 如果需要,将所需部分加载到可执行文件中。

  • 例:

    对象需要:
  • 打开
  • 关闭
  • BatchRead
  • BatchWrite

  • 库1提供:
  • 打开
  • 关闭
  • 阅读

  • 库2提供
  • BatchRead(但使用lib1:read)
  • BatchWrite(但使用lib1:write)

  • 如果像这样链接:



    然后,链接器将无法解析读取和写入符号。

    但是,如果我这样链接应用程序:



    然后它将正确链接。由于l2解决了BatchRead和BatchWrite依赖关系,但还添加了两个新的依赖关系(读和写)。当我们与l1链接时,接下来的所有四个依赖关系都已解决。

    关于c++ - GCC C++链接器错误: Undefined reference to 'vtable for XXX' ,对 'ClassName::ClassName()'的 undefined reference ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1095298/

    10-11 22:51