从 gcc 3.3.3 到 4.1.0 的移植,C++ 模板,未定义的引用

Posted

技术标签:

【中文标题】从 gcc 3.3.3 到 4.1.0 的移植,C++ 模板,未定义的引用【英文标题】:Port from gcc 3.3.3 to 4.1.0, C++ templates, undefined reference to 【发布时间】: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>'

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

【问题讨论】:

很难确定编译器已经告诉您的内容。你能把问题减少到最小的术语并发布吗? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

Salu2.

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

顺便说一句,在编写新代码时,打开所有警告标志是值得的。我特别喜欢 -Wall -Werror -pedantic,而且我认为是 -ansi。我发现这迫使我编写更好的代码,并且通常使移植更容易。

以上是关于从 gcc 3.3.3 到 4.1.0 的移植,C++ 模板,未定义的引用的主要内容,如果未能解决你的问题,请参考以下文章

将源代码从 Visual C++ 移植到 GCC 都有哪些陷阱[关闭]

将 std::wstring 从 Visual Studio 移植到 mingw gcc

将 std::wstring 移植到 gcc cygwin

编译一个C ++程序,它使用sfml和mingw从linux移植到windows

GoAhead4.1.0 移植

低版本GCC程序向高版本移植的兼容性问题