由于各种原因,我将std :: string子类化为:
class CotengString : public string
{
public:
// Constructors
CotengString();
CotengString(const char* ch) : string(ch) {}
CotengString(const string& str) : string(str) {}
virtual ~CotengString() {};
//Operator"="
CotengString& operator=(const string& str) { return (CotengString&)this->assign(str); }
CotengString& operator=(const char* ch) { return (CotengString&)this->assign(ch); }
};
在DLL内部我想使用这段代码都正确编译。但在我的Google Test项目中,我在切换到子类字符串
后出现此错误LNK2005 "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *,unsigned int)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z) already defined in gtest.lib(gtest-all.obj) Devices.Spectro.CppTest <path>\Devices.Spectro.CppTest\Devices.Spectro.Cpp.lib(Devices.Spectro.Cpp.dll)
我的直觉是我错过了一些明显的东西。但我不知道它可能是什么
答案 0 :(得分:1)
好的,然后作为答案。
在我看来,这是多个包含头文件的问题。 这导致编译器想要编译函数或在这种情况下再次分配器并检测“哦,我已经编译了!”。
所以修复就是添加到头文件中:
#ifndef CUSTOM_STRING_IMPLEMENTATION_HEADER
#define CUSTOM_STRING_IMPLEMENTATION_HEADER
....
#endif
但是,如果情况并非如此,您可能会尝试在使用 已包含已编译类的dll的代码中再次编译此文件。
我个人认为这是根据您的日志文件的第二个原因。有人说已经在你的库中编译了分配器。
如果您只使用头文件,则会导致严重问题。看这里。
Dll代码:
SomeHeaderFile.hpp
class NiceClass{
//Constructor is implemented. That causes several problems now!
NiceClass{
}
...
}
您的应用程序代码(使用dll):
SomeNiceApplicationCode:
//Linker error now! It's already compiled right into your dll!
#include <SomeHeaderFile.hpp>
int main(){
NiceClass niceClassInstance;
return 0;
}
应用这些更改并为您的班级创建和额外的cpp文件。
在您的应用程序文件 中仅包含头文件 。
class CotengString : public string
{
public:
// Constructors
CotengString();
CotengString(const char* ch) : string(ch); //Use cpp file!
CotengString(const string& str) : string(str); //""
virtual ~CotengString(); //""
//Operator"="
CotengString& operator=(const string& str); //Same for this
CotengString& operator=(const char* ch); //""
};