C++ 当I';我用VS2013编译?
我有一个第三方库,它是一个静态的.lib文件,他们告诉我是用VS2010编译的。我们在VS2013中开发应用程序,需要链接到此库 当我们尝试时,会出现以下错误: 错误C1047:对象或库文件“…/xxx.lib”是使用创建的 比其他对象更旧的编译器;重建旧对象和 图书馆 这是否意味着我们必须使用VS2010编译器链接到它?(我们无法获得该库的重新编译版本)或多或少;对 一般来说,C++程序的所有部分都需要编译和链接到完全相同的编译器(包括精确编译器版本)。 通常,在构建不同的部件时,还需要使用相同的编译器选项 也有例外,但这是一般的经验法则 < >不存在标准化的C++ ABI。C++ 当I';我用VS2013编译?,c++,visual-studio,visual-studio-2010,visual-c++,visual-studio-2013,C++,Visual Studio,Visual Studio 2010,Visual C++,Visual Studio 2013,我有一个第三方库,它是一个静态的.lib文件,他们告诉我是用VS2010编译的。我们在VS2013中开发应用程序,需要链接到此库 当我们尝试时,会出现以下错误: 错误C1047:对象或库文件“…/xxx.lib”是使用创建的 比其他对象更旧的编译器;重建旧对象和 图书馆 这是否意味着我们必须使用VS2010编译器链接到它?(我们无法获得该库的重新编译版本)或多或少;对 一般来说,C++程序的所有部分都需要编译和链接到完全相同的编译器(包括精确编译器版本)。 通常,在构建不同的部件时,还需要使用相
对
一般来说,C++程序的所有部分都需要编译和链接到完全相同的编译器(包括精确编译器版本)。 通常,在构建不同的部件时,还需要使用相同的编译器选项 也有例外,但这是一般的经验法则不存在标准化的C++ ABI。< /P>,不仅是同一个编译器,而且同样的选项在一定程度上是(特别是运行库和<>代码>迭代器Debug GoeS/<代码>应该匹配)。例如,如果在同一个可执行文件中链接调试和非调试对象/ LIBs,通常只会产生疼痛。@ JesperJuhl,您是什么意思?“没有标准化的C++ ABI”是指API吗?不,我指ABI——就像“应用程序二进制接口”一样。C++没有标准化的一个。这意味着你不能依赖由不同编译器(甚至不同的小版本)编译的对象是二进制兼容的(可链接的,可调用的)。。这意味着您必须对最终结果的所有组件(二进制或库)使用相同的编译器/链接器/选项才能获得正确的结果-您不能混合和匹配。这里的一个选项是使用VS 2010工具集创建一个DLL,将您对该静态库的使用封装在一个C-可调用函数中,然后您的主应用程序可以使用该DLL而不是静态库,因为DLL确实具有定义良好的ABI。不仅相同的编译器,而且在一定程度上也具有相同的选项(特别是,运行库和<代码>迭代器Debug GoeS/<代码>应该匹配)。例如,如果在同一个可执行文件中链接调试和非调试对象/ LIBs,通常只会产生疼痛。@ JesperJuhl,“你没有什么标准化的C++ ABI”是什么意思?不,我是指ABI——就像“应用程序二进制接口”一样。C++没有标准化的含义,意思是你不能依赖不同编译器(甚至不同的小版本)编译的对象是二进制兼容的(可链接的,可调用的)。这意味着对于正确的结果,你必须使用相同的编译器/链接器/选项来完成最终结果的所有组件。(二进制或库)-您不能混合和匹配。这里的一个选项是使用VS 2010工具集创建一个DLL,将您对该静态库的使用封装在一个C-可调用函数中,然后您的主应用程序可以使用该DLL而不是静态库,因为DLL确实具有定义良好的ABI。请注意,切换到for VS 2015后,旧的静态库可能无法使用甚至可以链接到VS 2015。如果无法重建,您应该制定计划在某个时候替换该黑盒库。请注意,切换到for VS 2015后,该旧静态库可能根本无法链接到VS 2015。如果无法重建,您应该制定计划在某个时候替换该黑盒库。