我需要将静态库链接到给定的目标文件。我既没有该文件的源代码也没有任何影响。
使用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”
答案 0 :(得分:2)
Visual Studio 2015编译器与使用早期版本的编译器创建的目标文件不兼容。 C运行时库进行了重大重组,打破了Visual Studio曾经拥有的C对象级别向后兼容性。您需要使用较旧的编译器来编译和创建静态库,然后将其与旧编译器创建的目标文件链接。您可以在Visual Studio 2015中通过安装Visual Studio 2010并在Visual Studio 2015项目属性中选择“配置属性 - ”下的“Visual Studio 2010(v100)”来执行此操作。一般 - &gt;平台工具集。