Visual Studio 2015 链接错误LNK2005

Visual Studio 2015 link error LNK2005

提问人:AndiA 提问时间:9/26/2016 更新时间:9/26/2016 访问量:1147

问:

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

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

在另一台机器上,我只有 VS 2015。当我构建我的 C 代码并将其链接到给定的库时,我收到以下错误:

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创建的库,但我需要printf语句进行可视化。

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

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

使用 VS2010 创建的库:

    2 public symbols

       BC _F_FUN
      310 _c_fun

使用 VS2015 创建的库: 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”

c visual-studio-2015 链接器 错误

评论


答:

2赞 Ross Ridge 9/26/2016 #1

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