我们刚刚尝试将使用Visual Studio Express 2008编译的代码与使用Visual Studio 2003编译的.lib文件链接起来,都是C ++。 更准确地说,它是在VS2003中编译为.lib的SystemC 2.2.0内核和在VS2008中编译的SystemC模型。
在链接时,我们一直收到错误消息,即在链接过程中找不到SystemC.lib文件(即在VS2003中编译)。 我们收到的错误消息是这样的(有几个变体):
通过各种线索的调查,发现.lib期望找到的功能是这个:
我试图找出为什么会发生这种不兼容的情况,但最终我放弃了,在VS2008中重新编译了完全相同的Visual Studio项目,并使用了那个SystemC.lib代替VS2003中的那个。现在,一切正常了。
因此,根本问题是:从VS2003到VS2008有什么改变会导致某些函数改变其调用约定?是否有一些神奇的标志可以传递给VS2008链接器,以使用其他库,在其中函数具有与VS2003编译时相同的调用约定?
更新,迄今为止回答的摘要:很可能微软会在每个Visual Studio主要版本之间更改C++(而不是C,只是C++)ABI。还可能存在其他导致不兼容性的库更改。最好的建议是为每个VS版本重新编译.lib文件。基本上,只需将其以源代码形式提供给用户,并让他们在本地使用他们安装的任何版本的VS进行编译即可。
通过使用以下建议,发现了基本问题:
在链接时,我们一直收到错误消息,即在链接过程中找不到SystemC.lib文件(即在VS2003中编译)。 我们收到的错误消息是这样的(有几个变体):
SystemC.lib(sc_port.obj) : error LNK2001: unresolved external symbol "public: vo
id __thiscall std::_String_base::_Xran(void)const " (?_Xran@_String_base@std@@QB
EXXZ)
通过各种线索的调查,发现.lib期望找到的功能是这个:
Undecoration of :- "?_Xran@_String_base@std@@QBEXXZ"
is :- "public: void __thiscall std::_String_base::_Xran(void)const "
当时 VS2008 尝试链接的库文件(libcpmt.lib)使用了不同的调用约定:
Undecoration of :- "?_Xran@_String_base@std@@SAXXZ"
is :- "public: static void __cdecl std::_String_base::_Xran(void)"
我试图找出为什么会发生这种不兼容的情况,但最终我放弃了,在VS2008中重新编译了完全相同的Visual Studio项目,并使用了那个SystemC.lib代替VS2003中的那个。现在,一切正常了。
因此,根本问题是:从VS2003到VS2008有什么改变会导致某些函数改变其调用约定?是否有一些神奇的标志可以传递给VS2008链接器,以使用其他库,在其中函数具有与VS2003编译时相同的调用约定?
更新,迄今为止回答的摘要:很可能微软会在每个Visual Studio主要版本之间更改C++(而不是C,只是C++)ABI。还可能存在其他导致不兼容性的库更改。最好的建议是为每个VS版本重新编译.lib文件。基本上,只需将其以源代码形式提供给用户,并让他们在本地使用他们安装的任何版本的VS进行编译即可。
通过使用以下建议,发现了基本问题:
请注意,这些问题没有回答此问题: