2015-09-23 28 views
1

我正在使用VS2015社區。我已經獲得了一些我正在嘗試構建的C代碼。它全部用C語言編寫,我做了一個項目作爲控制檯應用程序。無法解析的___stdio_common_vsprintf_s,什麼庫有這個?

當我建立我得到下面的錯誤。問題是在鏈接過程中無法找到__stdio_common_vsprintf_s。所以我搜索了互聯網的符號,但沒有得到任何有用的信息。

我正在使用稱爲多線程(/ MT)的運行時庫設置。

我曾嘗試添加#define STDC_WANT_LIB_EXT1 1之前都包括但沒有幫助。我已經搜索這個問題,並沒有找到任何幫助的帖子。

因此,我搜索了所有的VS庫,並得到很多點擊,但我不知道哪些是定義,哪些是引用。然後我搜索了VS包含文件夾中的所有.h文件,但沒有命中。

我懷疑可能有另一個我需要的庫,但不知道它是什麼。有沒有人有任何想法?

1>LIBCMT.lib(_error_.obj) : error LNK2019: unresolved external symbol ___stdio_common_vsprintf_s referenced in function __vsprintf_s_l 
1>LIBCMT.lib(_pdblkup_.obj) : error LNK2019: unresolved external symbol ___vcrt_GetModuleFileNameW referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char *,wchar_t *,unsigned long,int *,wchar_t *,unsigned long)" ([email protected]@[email protected]) 
1>LIBCMT.lib(_pdblkup_.obj) : error LNK2019: unresolved external symbol ___vcrt_LoadLibraryExW referenced in function "struct HINSTANCE__ * __cdecl GetPdbDllFromInstallPath(void)" ([email protected]@[email protected]@XZ) 
1>MSVCRTD.lib(_chandler4gs_.obj) : error LNK2019: unresolved external symbol __except_handler4_common referenced in function __except_handler4 
1>W:\efifs\Debug\testing.exe : fatal error LNK1120: 6 unresolved externals 

這裏是我的選擇:

Compile 
---------- 
/GS 
/analyze- 
/W3 
/Zc:wchar_t 
/I"W:\efifs\\gnu-efi\inc" 
/I"W:\efifs\\gnu-efi\inc\ia32" 
/I"W:\efifs\\grub\include" 
/I"W:\efifs\\grub-core\lib\minilzo" 
/I"W:\efifs\testing\" 
/I"W:\efifs\\gnu-efi\inc\protocol" 
/I"W:\efifs\\gnu-efi\lib" 
/I"W:\efifs\\include" 
/I"W:\efifs\\grub\grub-core\lib\minilzo" 
/I"W:\efifs\.msvc" 
/ZI 
/Gm 
/Od 
/Fd"Debug\vc140.pdb" 
/Zc:inline 
/fp:precise 
/D "__STDC_WANT_LIB_EXT1__=1" 
/D "_UNICODE" 
/D "UNICODE" 
/D "GRUB_FILE=__FILE__" 
/D "HAVE_USE_MS_ABI" 
/D "GNU_EFI_USE_EXTERNAL_STDARG" 
/D "DRIVERNAME=testing" 
/D "WIN32" 
/D "_DEBUG" 
/D "_CONSOLE" 
/errorReport:prompt 
/WX- 
/Zc:forScope 
/RTC1 
/Gd 
/Oy- 
/MT 
/Fa"Debug\" 
/EHsc 
/nologo 
/Fo"Debug\" 
/Fp"Debug\testing.pch" 

Link 
----- 
/OUT:"W:\efifs\Debug\testing.exe" 
/MANIFEST 
/NXCOMPAT 
/PDB:"W:\efifs\Debug\testing.pdb" 
/DYNAMICBASE "efifs.lib" "grub.lib" "gnu-efi.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" 
/MACHINE:X86 
/INCREMENTAL 
/PGD:"W:\efifs\Debug\testing.pgd" 
/SUBSYSTEM:CONSOLE 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"Debug\testing.exe.intermediate.manifest" 
/ERRORREPORT:PROMPT 
/NOLOGO 
/LIBPATH:"W:\efifs\testing\\grub" 
/LIBPATH:"W:\efifs\testing\\efifs" 
/LIBPATH:"W:\efifs\testing\\gnu-efi" 
/TLBID:1 
+0

你包括標題前加上'#定義__STDC_WANT_LIB_EXT1__ 1'? – Lundin

+0

@Olaf自從何時編譯器消息不是不可讀的混亂?沒有錯誤的海報。 – Lundin

+1

@Lundin:這些似乎是多行。由於不恰當的格式化,部分大膽的面孔也不會使其更具可讀性。用戶在這裏> 1年,應該知道。 – Olaf

回答

0

按照C標準附錄K

K.3.1.1標準頭

的函數,宏和類型如果_ _STDC_WANT_LIB_EXT1_ _在K.3中聲明或定義,並且其子條款不是 ,是 定義爲一個宏,它在源文件 中的第一個被包含的地方展開爲整數常量0。

含義,爲了使用「_s」功能,如vsprintf_s,這是所提到的附件中都發現,你必須定義,包括頭文件之前宏0以外的值。

#define __STDC_WANT_LIB_EXT1__ 1 
#include <stdarg.h> 
#include <stdio.h> 

我懷疑你必須有一個C11編譯器。無論Visual Studio是否遵循這個標準,我都不知道。它的惡劣的標準一致性是臭名昭着的。

+0

添加「__STDC_WANT_LIB_EXT1__ 1」沒有幫助。我認爲有一個庫必須包含_stdio_common_vsprintf_s。 – eddyq

3

您的配置看起來不正確。您似乎沒有鏈接到Visual Studio 2015's reorganization of the C runtime library中添加的一些新庫。您似乎還要鏈接同一個庫的發行版靜態(/ MT)和調試DLL(/ MDd)版本,具體爲LIBCMT.libMSVCRTD.lib

符號___stdio_common_vsprintf_s可以在通用CRT中找到,它是Windows 10 SDK的一部分。該庫的發行靜態版本被稱爲libucrt.lib。其他未解決的符號是屬於Visual Studio 2015的「vcruntime」庫的一部分。它的發佈靜態版本的名稱是libvcruntime.lib.

不清楚爲什麼你沒有鏈接正確的庫。通常這會自動處理你。您需要檢查項目的配置設置以查看您已覆蓋默認行爲的位置。

0

如果你看看如何聲明vsprintf,你可以跟蹤它corecrt_stdio ...它說它內聯它。

我有一些舊的DLL鏈接到舊的msvcrt,並嘗試從它導入vsprintf,但似乎像VS2015有新的標題,並試圖內聯它。

設置_NO_CRT_STDIO_INLINE幫助解決它,享受。

編輯:也https://msdn.microsoft.com/en-us/library/bb531344.aspx

+0

不知道爲什麼這是downvoted ..它是有效的:https://connect.microsoft.com/VisualStudio/feedback/details/1151324/memcpy-s-memmove-s-always-inline – Jon

相關問題