gpt4 book ai didi

c++ - 为什么优化标志会导致某些模板函数的链接器错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:20 25 4
gpt4 key购买 nike

我遇到一个问题,即应用程序在 Debug模式下编译良好且所有优化都已关闭。但是当我编译发布时,它会打印出 Unresolved 链接错误。

有问题的功能如下:

template <typename T>
T & Block::val(size_t offset)
{
return *(reinterpret_cast<T*>(_data + offset));
}

template <typename T>
const T & Block::val(size_t offset) const
{
return *(reinterpret_cast<T*>(_data + offset));
}

我得到的错误都是这样的:

undefined reference to `unsigned long long& Block::val<unsigned long long>(unsigned long)'

这可能是什么原因造成的?

最佳答案

您通常不会将模板实现放在 .cpp 中,而是放在 .h 或 .inl 中,它包含在 .h 中,可能是 .o 的调试版本对其导出的符号更加自由.

在 .o 的调试和发布版本上运行 nm 并比较符号。

由于单一定义规则,模板在链接器中是不常见的。对于模板,正文位于标题中,这会导致多个等价 定义,每个翻译单元一个。链接器让它们都存在直到最后一刻,它任意选择一个并丢弃其他的。

我在这里猜测,但我怀疑当你在没有优化的情况下编译时,主体被视为正常,但是当优化正在进行时,编译器会花费一些额外的努力来确定这个主体在其他翻译中不可见单位并拒绝导出。

查找extern templates .

关于c++ - 为什么优化标志会导致某些模板函数的链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com