【问题标题】:Port from gcc 3.3.3 to 4.1.0, C++ templates, undefined reference to从 gcc 3.3.3 到 4.1.0 的移植,C++ 模板,未定义的引用
【发布时间】:2009-06-01 13:02:34
【问题描述】:

我们的应用程序在很多地方都使用了 C++ 模板。我目前正在尝试从 gcc 3.3.3 移植到 4.1.0 并遇到问题。我在一个小型共享库和可执行文件中重新创建了这个问题。我正在构建共享库 好的,但可执行文件无法与以下内容链接:

    undefined reference to `MyNumber<int>::~MyNumber()'
    undefined reference to `MyNumber<int>::MyNumber(int)'
    undefined reference to `MyNumber<int>::number()'

我没有直接在可执行文件中使用模板类,并且希望这一切都被封装在共享库的实现中(可能是天真地如此)。

只有在使用共享库时才会出现此问题。当我在 SLES 11 (gcc 4.3.2) 上构建我们的应用程序时,我的大部分问题似乎都得到了解决,但我仍然收到以下一些:

    undefined reference to `vtable for MYCLASS<T1, T2>'

这一切都是在将可执行文件链接到共享库时。

【问题讨论】:

  • 很难确定编译器已经告诉您的内容。你能把问题减少到最小的术语并发布吗?

标签: c++ templates gcc


【解决方案1】:

这是一个非常晦涩难懂的消息,但这意味着您没有定义虚函数,请参阅here

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,通过在头文件中实现函数解决了它,而不是在 cpp 文件中。

    Salu2.

    【讨论】:

      【解决方案3】:

      如果不了解更多关于您的源代码,这很难回答。然而,在gcc mailing list 上提出这个特殊问题可能会产生更好的结果,因为从事 gcc 工作的人比其他人都更了解所有的复杂性。

      【讨论】:

        【解决方案4】:

        感谢 cmets。我从我的编译/链接选项中删除了 -frepo 和 -fno-impicit-templates,一切顺利。

        【讨论】:

        • 顺便说一句,在编写新代码时,打开所有警告标志是值得的。我特别喜欢 -Wall -Werror -pedantic,而且我认为是 -ansi。我发现这迫使我编写更好的代码,并且通常使移植更容易。
        猜你喜欢
        • 2011-03-25
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        相关资源
        最近更新 更多