Visual Studio 2015链接错误LNK2005

时间:2016-09-26 14:52:02

标签: c visual-studio-2010 visual-studio-2015 linker linker-errors

我需要将静态库链接到给定的目标文件。我既没有该文件的源代码也没有任何影响。

使用Visual Studio 2010时,我可以创建一个库并将其链接到给定文件。

在另一台机器上我只有VS 2015.当我构建并将我的C-Code链接到给定的lib时,我收到以下错误:

LIBCMT.lib(vfprintf.obj) : error LNK2005: __vfprintf_l already defined in c_fun.obj
LIBCMT.lib(printf.obj) : error LNK2005: _printf already defined in c_fun.obj

出于测试目的,我使用以下简化代码:

#include <stdio.h>

void c_fun(double C_IN,  double *C_OUT)
{
    *C_OUT = C_IN * 2.0;

    printf("Hallo C!\n");
}

当我推荐printf行时,我可以成功链接用VS2015创建的lib,但我需要printf语句用于可视化目的。

要编译我的lib,我在命令行中使用相同的参数。是否有编译器或链接器选项来生成VS 2010兼容库?

当我对两个lib使用dumpbin / all时,我得到以下输出:

使用VS2010创建的Lib:

    2 public symbols

       BC _F_FUN
      310 _c_fun

使用VS2015创建的Lib:         7个公共符号

      1DE _F_FUN
      432 ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9
      432 ___local_stdio_printf_options
      432 __real@4000000000000000
      432 __vfprintf_l
      432 _c_fun
      432 _printf

我希望两个版本都能得到相同的符号。

我使用的编译器选项都是“/ MT / W3 / EHsc / c”

1 个答案:

答案 0 :(得分:2)

Visual Studio 2015编译器与使用早期版本的编译器创建的目标文件不兼容。 C运行时库进行了重大重组,打破了Visual Studio曾经拥有的C对象级别向后兼容性。您需要使用较旧的编译器来编译和创建静态库,然后将其与旧编译器创建的目标文件链接。您可以在Visual Studio 2015中通​​过安装Visual Studio 2010并在Visual Studio 2015项目属性中选择“配置属性 - ”下的“Visual Studio 2010(v100)”来执行此操作。一般 - &gt;平台工具集。