0

我正在将一个大型项目从 Visual Studio 2008(平台工具集 v90)迁移到 Visual Studio 2010(平台工具集 v100)

该项目依赖于使用 v90 工具集编译的库。这个库主要是用 C 语言编写的,只有一个 c++ 类,它在一些地方使用了 std:string。不幸的是,由于工具集的更改,这种用法使我无法使用链接的库进行编译

我从错误中删除了库名称:

 : error LNK2001: unresolved external symbol "__declspec(dllimport) 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> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) 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)" (__imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (__imp_?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) public: static unsigned int const std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::npos" (__imp_?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char const *)" (__imp_??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (__imp_??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) 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 *)" (__imp_??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z)
 : error LNK2001: unresolved external symbol "__declspec(dllimport) 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)" (__imp_??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ)

我可以做些什么来在平台工具集 v100 下编译这个库吗?该库是专有的,因此我无法获取源代码并自己重新编译。

4

1 回答 1

0

如果获得库的 VC2010 版本是不可能的,那么您将需要使用 VS2008 构建一个 DLL,以提供 VS2008 静态库中的功能。

您可能无法使用 C++ 链接到此 DLL,当然也无法在 DLL 和您的主应用程序之间直接传递 std::string。这是因为内存布局/接口不同,您最终会遇到 ODR 违规和崩溃等(如果您甚至可以以这种方式编译/链接它而不会出现大量错误)。

因此,您需要制作 DLL 公开的 C 样式 API,以供您的 VS2010 主应用程序使用。字符串将需要作为 c 样式const char*const wchar_t*字符串或其他一些结构/不透明指针传递。

如果您可以以静态链接到 VS2008 运行时的方式构建 DLL,那么它将简化部署,否则您将需要使用您的应用程序安装程序以您选择的任何方式分发 VS2008 和 VS2010 运行时。

于 2013-07-03T12:19:07.603 回答