小编JPh*_*618的帖子

从DLL导出STL std :: basic_string模板时,出现LNK2005错误

好的,所以我已经阅读了几个关于这个主题的问题和文章,我觉得我理解基础知识,但我仍然遇到麻烦.

我有一个DLL导出一个具有std :: string作为成员的类.我的主程序包含也有字符串的类,它使用DLL.

如果我在VS2010中编译DLL,我会收到以下警告:

warning C4251: 'MyClass::data' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'MyClass'
Run Code Online (Sandbox Code Playgroud)

当我编译EXE时,我得到相同的警告,但没有错误,程序编译并运行.实际上,这是一个大项目,所以我得到了40个警告,我不太热衷于此.(作为侧面观察,使用VS2008编译时不会出现这些警告)

所以,我读到了这个警告,它引导我阅读这篇MS文章:http: //support.microsoft.com/default.aspx? scid = KB; EN-US; 168958,它告诉我如何从一个STL模板导出DLL来满足我得到的警告.

问题是,当我添加以下行以删除警告时:

EXPIMP_TEMPLATE template class DECLSPECIFIER std::allocator<char>;
EXPIMP_TEMPLATE template class DECLSPECIFIER std::basic_string< char, std::char_traits<char>, std::allocator<char> >;
Run Code Online (Sandbox Code Playgroud)

DLL编译没有警告,但是当我编译我的EXE时,链接器会抛出一个拟合:

2>SampleDLL.lib(SampleDLL.dll) : error 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> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in OtherClass.obj
2>SampleDLL.lib(SampleDLL.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::size(void)const " …
Run Code Online (Sandbox Code Playgroud)

c++ dll stl visual-studio-2010

10
推荐指数
1
解决办法
1万
查看次数

为什么VisualStudio会查找此lib文件?LNK1104错误

我们有一个使用VS2008和boost 1_42的大型项目.我正在尝试升级到VS2010并提升1_44.我安装了VS2010并提升了1_44并转换了项目.现在我正在尝试构建,并且所有内容都会编译,但在链接时会失败:

LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc90-mt-1_42.lib'

我已经将include和lib目录更改为指向新的boost 1_44文件,并且我已经重命名了旧的boost 1_42目录.

当链接器仅使用1_44头时,为什么链接器仍然在寻找vc90-1_42文件?有没有办法可以确定链接器想要这个文件的原因?链接器显然认为它需要文件,但为什么呢?

我已经清理了项目,我正在重新构建以确保删除任何旧的构建文件.

c++ linker boost visual-studio-2010

5
推荐指数
2
解决办法
4771
查看次数

标签 统计

c++ ×2

visual-studio-2010 ×2

boost ×1

dll ×1

linker ×1

stl ×1