问题描述
如何在 Visual Studio 2019 中配置一个 Visual C++ 项目以仅使用 C 标准库?
我尝试将项目的链接器输入设置下的“忽略所有默认库”设置为“是”,然后在“附加依赖项”下添加了 msvcrt.lib
。
我收到了这些错误:
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __seh_filter_exe
referenced in function "int __cdecl __scrt_common_main_seh(void)" (?
__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __set_app_type
referenced in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol ___setusermatherr
referenced in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __configure_narrow_argv
referenced in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol __configure_narrow_argv
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol
__initialize_narrow_environment referenced in function "int __cdecl
pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol
__initialize_narrow_environment
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol
__get_initial_narrow_environment referenced in function "int __cdecl
__scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __initterm referenced
in
function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __initterm_e referenced
in function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol _exit referenced in
function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __exit referenced in
function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __set_fmode referenced
in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol ___p___argc referenced
in function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol ___p___argv referenced
in function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __cexit referenced in
function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol __cexit
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __c_exit referenced in
function "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol
__register_thread_local_exe_atexit_callback referenced in function "int __cdecl
__scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __configthreadlocale
referenced in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol __set_new_mode
referenced in function "void __cdecl pre_cpp_initialization(void)" (?
pre_cpp_initialization@@YAXXZ)
1>msvcrt.lib(exe_main.obj) : error LNK2019: unresolved external symbol ___p__commode
referenced
in function "int __cdecl pre_c_initialization(void)" (?pre_c_initialization@@YAHXZ)
1>msvcrt.lib(error.obj) : error LNK2019: unresolved external symbol _strcpy_s referenced in
function "void __cdecl _RTC_StackFailure(void *,char const *)" (?
_RTC_StackFailure@@YAXpaxPBD@Z)
1>msvcrt.lib(error.obj) : error LNK2019: unresolved external symbol _strcat_s referenced in
function "void __cdecl _RTC_StackFailure(void *,char const *)" (?
_RTC_StackFailure@@YAXpaxPBD@Z)
1>msvcrt.lib(error.obj) : error LNK2019: unresolved external symbol ___stdio_common_vsprintf_s
referenced in function __vsprintf_s_l
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __seh_filter_dll
referenced in function ___scrt_dllmain_exception_filter
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol
__initialize_onexit_table
referenced in function ___scrt_initialize_onexit_tables
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol
__register_onexit_function referenced in function __onexit
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __execute_onexit_table
referenced in function ___scrt_dllmain_uninitialize_c
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __crt_atexit referenced
in function __onexit
1>msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __crt_at_quick_exit
referenced in function _at_quick_exit
1>msvcrt.lib(tncleanup.obj) : error LNK2019: unresolved external symbol
___std_type_info_destroy_list referenced in function "void __cdecl
__scrt_uninitialize_type_info(void)" (?__scrt_uninitialize_type_info@@YAXXZ)
1>msvcrt.lib(default_precision.obj) : error LNK2019: unresolved external symbol __controlfp_s
referenced in function __initialize_default_precision
1>msvcrt.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol _terminate
referenced in function ___scrt_unhandled_exception_filter@4
1>msvcrt.lib(chandler4_noexcept.obj) : error LNK2001: unresolved external symbol _terminate
1>msvcrt.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol
___current_exception referenced in function ___scrt_unhandled_exception_filter@4
1>msvcrt.lib(chandler4_noexcept.obj) : error LNK2001: unresolved external symbol
___current_exception
1>msvcrt.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol
___current_exception_context referenced in function ___scrt_unhandled_exception_filter@4
1>msvcrt.lib(chandler4_noexcept.obj) : error LNK2001: unresolved external symbol
___current_exception_context
1>msvcrt.lib(utility_desktop.obj) : error LNK2019: unresolved external symbol _memset
referenced in function ___scrt_fastfail
1>msvcrt.lib(chandler4gs.obj) : error LNK2019: unresolved external symbol
__except_handler4_common referenced in function __except_handler4
1>msvcrt.lib(pdblkup.obj) : error LNK2019: unresolved external symbol
___vcrt_GetmodulefileNameW referenced in function "int __cdecl _RTC_GetSrcLine(unsigned char
*,wchar_t *,unsigned long,int *,unsigned long)" (?
_RTC_GetSrcLine@@YahpAEPA_WKPAH1K@Z)
1>msvcrt.lib(pdblkup.obj) : error LNK2019: unresolved external symbol ___vcrt_LoadLibraryExW
referenced in function "struct HINSTANCE__ * __cdecl GetPdbDllFromInstallPath(void)" (?
GetPdbDllFromInstallPath@@YAPAUHINSTANCE__@@XZ)
我还尝试将 kernel32.lib
和 user32.lib
添加到依赖项中,但它显示了相同的错误。
解决方法
您可以在 VS 中为 C 和 C++ 使用 C++ 项目。它将理解这两种类型的代码。只需将您的源文件保存为 .c 并将头文件保存为 .h 而不是 .cpp 或 .hpp。 VS 2019 会自动调整和编译两者。