0

我需要將靜態庫鏈接到給定的對象文件。我沒有該文件的源代碼,也沒有任何影響。Visual Studio 2015鏈接錯誤LNK2005

使用Visual Studio 2010時,我可以創建一個庫並將其與給定文件進行鏈接。

在不同的機器上我只有VS 2015年當我建立我的C代碼鏈接到指定的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兼容庫?

當我使用DUMPBIN /所有兩個庫,我得到以下的輸出:

庫用VS2010創建:

2 public symbols 

     BC _F_FUN 
     310 _c_fun 

庫用VS2015創建: 7公共符號

 1DE _F_FUN 
     432 [email protected][email protected]@[email protected] 
     432 ___local_stdio_printf_options 
     432 [email protected] 
     432 __vfprintf_l 
     432 _c_fun 
     432 _printf 

我期望在兩個版本中都能得到相同的符號。

我使用的編譯器選項兩次「/ MT/W3/EHSC/C」

回答

2

在Visual Studio 2015年編譯器不與早期版本的編譯器創建的對象文件兼容。 C運行時庫有一個重大的重組,破壞了Visual Studio以前的C對象級向後兼容性。您需要使用較舊的編譯器來編譯和創建靜態庫,然後將其與舊版編譯器創建的對象文件進行鏈接。您可以在Visual Studio 2015中通​​過安裝Visual Studio 2010並在您的Visual Studio 2015項目屬性中選擇「配置屬性 - >常規 - >平臺工具集」下的「Visual Studio 2010(v100)」來執行此操作。