我正在使用VS2015社区。我已经获得了一些我正在尝试构建的C代码。它全部在C中,我已经将项目作为控制台应用程序。
当我构建时,我得到以下错误。问题是在链接过程中找不到__stdio_common_vsprintf_s。所以我在互联网上搜索符号,但没有得到任何有用的信息。
我正在使用名为Multi-threaded(/ MT)的运行时库设置。
我尝试在所有包含之前添加#define STDC_WANT_LIB_EXT1 1,但这没有帮助。我已经搜索过这个问题,但没有发现任何有用的帖子。
所以我搜索了所有的VS库并获得了大量的点击,但我不知道哪些是定义,哪些是引用。然后我搜索了VS include文件夹中的所有.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)" (?_RTC_GetSrcLine@@YAHPAEPA_WKPAH1K@Z)
1>LIBCMT.lib(_pdblkup_.obj) : error LNK2019: unresolved external symbol ___vcrt_LoadLibraryExW referenced in function "struct HINSTANCE__ * __cdecl GetPdbDllFromInstallPath(void)" (?GetPdbDllFromInstallPath@@YAPAUHINSTANCE__@@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 :(得分:3)
您的配置似乎不正确。您似乎无法链接Visual Studio 2015's reorganization of the C runtime library中添加的几个新库。您还可以链接同一个库的发布静态(/ MT)和调试DLL(/ MDd)版本,特别是LIBCMT.lib
和MSVCRTD.lib
。
符号___stdio_common_vsprintf_s
可以在Universal CRT中找到,它是Windows 10 SDK的一部分。该库的发行版静态版本称为libucrt.lib
。其他未解决的符号是" vcruntime"的一部分。库是Visual Studio 2015的一部分。它的发布静态版本的名称是libvcruntime.lib.
不清楚为什么你没有链接正确的库。通常这会自动处理。您需要检查项目的配置设置,以查看您覆盖默认行为的位置。
答案 1 :(得分:2)
如果您看一下如何声明vsprintf,您可以跟踪它corecrt_stdio ...它说内联它。
我有一些旧的DLL链接旧的msvcrt并试图从它导入vsprintf但似乎VS2015有新的标题并试图内联它。
设置_NO_CRT_STDIO_INLINE有助于解决它,享受。
答案 2 :(得分:1)
你需要插入这一行
#define _NO_CRT_STDIO_INLINE
答案 3 :(得分:0)
根据C标准附录K
K.3.1.1标准标题
K.3及其子条款中声明或定义的函数,宏和类型不是 如果_ _STDC_WANT_LIB_EXT1_ _是,则由它们各自的标题声明或定义 定义为在源文件中的点处扩展为整数常量0的宏 首先包含适当标头的位置。
这意味着为了使用{_ 1}这样的“_s”函数,这些函数都在上面提到的附件中找到,你必须在包含头文件之前将该宏定义为0以外的值。
vsprintf_s
我怀疑你必须有一个C11编译器。无论Visual Studio是否遵循该标准,我都不知道。它的标准一致性很差,这是臭名昭着的。