C++ 为fstream重写streambuf
我正在将非常旧的遗留代码从VS2008移植到VS2013。这个代码库的一部分是一个相当复杂的文件日志库,它覆盖streambuf并将其与fstream关联。它通过继承streambuf和fstream来实现这一点 但当我尝试将生成的DLL与使用它的另一个DLL链接时,我得到:C++ 为fstream重写streambuf,c++,stl,C++,Stl,我正在将非常旧的遗留代码从VS2008移植到VS2013。这个代码库的一部分是一个相当复杂的文件日志库,它覆盖streambuf并将其与fstream关联。它通过继承streambuf和fstream来实现这一点 但当我尝试将生成的DLL与使用它的另一个DLL链接时,我得到: 1>syscored.lib(syscored.dll):错误LNK2005:“public:void\uu thiscall” 标准::基本流程::关闭(无效)” (?关闭@?$basic)_fstream@DU?$ch
1>syscored.lib(syscored.dll):错误LNK2005:“public:void\uu thiscall”
标准::基本流程::关闭(无效)”
(?关闭@?$basic)_fstream@DU?$char_traits@D@std@@@std@@QAEXZ)已存在
在iptsrvfl.obj中定义
1> syscored.lib(syscored.dll):错误LNK2005:
“public:void\u thiscall std::basic\u fstream::`vbase析构函数'(void)”
(???$basic)_fstream@DU?$char_traits@D@std@@@std@@QAEXZ)已存在
在iptsrvfl.obj中定义
基本上,从fstream继承会导致DLL导出fstream的一些符号。使用该DLL的类也使用标准的fstream实例,close()和dtor()的符号被视为已定义
我已尝试将fstream派生类更改为使用包含而不是继承,但无法将自定义streambuf与包含的流相关联。它不是通过公共接口公开的。(我们在fstream的ctor中调用init(streambuf)
谁能告诉我:
1) 如何将streambuf与包含的流相关联,或
2) 如何避免此符号冲突
谢谢。您可以通过链接到CRT DLL来避免符号冲突。静态编译只有在编译一个独立的EXE或一个不输出任何标准C++类型(即纯C接口或COM DLL)的DLL时才有意义。 < P>如果导出类继承了未显式导出的模板实例化,则编译器隐式导出此模板实例化。你不想这样做,因为这会导致你所看到的那种错误 因此,您不应该像以前那样导出logger类。事实上,您应该很少导出类。如果需要使类的实例在DLL之外可用,请导出类工厂(函数)。仅当您希望其他人继承某个类时才导出该类,并且永远不要导出任何类型的模板。您可以导出特定的模板实例化
如果您需要从标准库模板继承,并且希望其他人进一步继承您的类,则可能必须使其成为仅标题的所有内联类,或者可能有选择地导出其方法而不是类本身。“streambuf和fstream的继承”。同一个类是同时继承streambuf和fstream,还是两个不同的类?两个不同的类。streambuf派生类不是我真正的问题。问题是我如何将它与fstream相关联。看起来遗留代码是照本宣科的。没什么问题。显示如何链接DLL(完整链接器命令)。是否使用include-guard(或
#pragma once
)@0x499602D2:这是编译时的事情,不是链接时。我不确定静态链接是什么意思。我正在链接到生成的DLL的导入库。您正在动态链接您的DLL。您如何链接到CRT/MT还是/MD?我正在使用/MD和/mdt谢谢。解释得很好。