gpt4 book ai didi

c++ - LNK4221 : operator<< overload not exported in static library

转载 作者:行者123 更新时间:2023-11-30 03:54:39 24 4
gpt4 key购买 nike

尽管有很多关于类似主题的问题,但我找不到能解决我的问题的问题。

我使用的是 Visual Studio 2013 社区版。我有一个包含两个项目的解决方案。一个项目被编译为静态库,另一个是应用程序。该应用程序依赖于静态库,并且可以正常编译和运行。

一个类(.cpp/.h 对),特别是 Ref,被链接器忽略(源代码列在底部)。从我的编译输出来看,ref.cpp 是在 namespace.cpp 之前编译的。 namespace.cpp 间接包含 ref.h,可能导致链接器的先进后出行为忽略 Ref ?

我在 ref.cpp 和 ref.h 中都有一个 operator<< 的重载。为什么它似乎被忽略了?

warning LNK4221: This object file does not define any previously undefined public symbols, so it will not be used by any link operation that consumes this library  [...]Omni\Core\ref.obj  Core

引用.h

#ifndef REF_H
#define REF_H

#include <memory>
#include <ostream>

namespace Omni
{
template<typename T>
using Ref = std::shared_ptr<T>;
}

template<typename T>
std::ostream & operator<<(std::ostream & s, const Omni::Ref<T> type);

#endif // REF_H

(我知道 using namespace Omni; 排除了对 Omni:: 的需要,但在调试时我喜欢双重确定。)

引用.cpp

#include "ref.h"

using namespace Omni;

template<typename T>
std::ostream & operator<<(std::ostream & s, const Omni::Ref<T> value)
{
return s << *value;
}

最佳答案

啊,我可以看到你做了什么。您认为 ref.cpp 中的函数定义实际上并不是函数定义(即它不生成代码)。它只是一个模板函数定义。

为了让这个模板引起代码的生成,你必须实际引用一个模板函数的具体例子。

但是当然在你的 ref.cpp 中没有任何地方这样做,所以当 ref.cpp 被编译时没有 operator<<(std::ostream&, const Omni::Ref<T>) 的具体例子。已经实例化。

当您的客户端代码调用 operator<< 时在 Omni::Ref<T> 上对于任何 T ,它可以很好地生成调用站点代码,因为有一个模板原型(prototype),但没有实际创建函数实现的信息 - 这是在客户端代码无法使用的 ref.cpp 中。

解决方法:将模板函数的定义放在头文件中。

关于c++ - LNK4221 : operator<< overload not exported in static library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435195/

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