提问人:AndiA 提问时间:9/26/2016 更新时间:9/26/2016 访问量:1147
Visual Studio 2015 链接错误LNK2005
Visual Studio 2015 link error LNK2005
问:
我需要将静态库链接到给定的目标文件。我既没有该文件的源代码,也没有对它有任何影响。
使用 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”
答:
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)”。
评论