Mar*_*arc 2 c c++ visual-studio-2005 calling-convention visual-studio-2008
我正在开发一个链接到第三方静态库的项目(herin称为EXTERNALLIB).在Visual Studio 2005中,我能够链接到EXTERNALLIB并创建可用的可执行文件.现在我们正在使用Visual Studio 2008,我收到以下错误:
fatal error C1047: The object or library file EXTERNALLIB was created with an older compiler than other objects; rebuild old objects and libraries.
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉编译器正确链接到EXTERNALLIB?我认为问题可能与特定的调用约定有关(__ stdcall,__ cdecl,__ clrcall,__ thishisall).我可以在新程序中指出旧库的正确调用约定吗?是否有我可以提供给我们供应商的具体反馈(例如在头文件中使用APIENTRY),以便将来的编译器升级不会出现此问题?
代码是用C++编写的.我无法访问EXTERNALLIB的代码,因此我无法自己重建它.
您的问题很可能是由于"代码是用C++编写的".用于C++链接的ABI基本上完全没有被任何标准指定,并且众所周知可以从编译器更改为编译器.我怀疑VS试图告诉你ABI再次发生了变化,结果它无法直接链接到库.
想要在DLL中实现C++对象通常会加剧这个问题,但幸运的是,这里没有这个问题.
应该使用的解决方案的一种方法是使用C可调用适配器为已发布的EXTERNALLIB API设置外观,并将整个事物链接到DLL中.使用较旧的VS版本构建皮肤(最坏的情况是,仍然可以找到免费版本).确保仅显示extern "C"功能.特别要确保没有从DLL中暴露全局对象(尽管它们可能需要存在于您的皮肤中).
最好的答案是回到EXTERNALLIB的供应商,并礼貌地报告无法与当前的VS链接作为错误并请求重建版本.