哪个库包含_is_c_termination_complete

Posted

技术标签:

【中文标题】哪个库包含_is_c_termination_complete【英文标题】:which library contains _is_c_termination_complete 【发布时间】:2019-01-10 08:24:36 【问题描述】:

我在将 C++ 代码与标准库 C++ 库链接时遇到 LNK2019 错误。我需要知道哪些库包含函数:

is_c_termination_complete, __acrt_initialize, __acrt_uninitialize, __acrt_uninitialize_critical, __acrt_thread_attach, __acrt_thread_detach

将其包含在链接过程中。

我正在使用 MS Visual Studio 社区 2017 和 Intel Parallel studio xe 2019 更新 1 用 C++ 编写代码,以集成到第 3 方软件中。 3rd 方软件提供了一个“make”选项来编译目标文件并将它们链接在一起。

编译工作正常,链接提供了一个问题。

第 3 方软件提供了一个入口,以变量的形式提供基本的链接器选项。默认选项如下:

link_sl='LINK', '/nologo', '/NOENTRY', '/INCREMENTAL:NO', '/subsystem:console', '/machine:AMD64', 
' /NODEFAULTLIB:LIBC.LIB', '/NODEFAULTLIB:LIBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB', '/DEFAULTLIB:LIBIFCOREMD.LIB', '/DEFAULTLIB:LIBIFPORTMD.LIB', '/DEFAULTLIB:LIBMMD.LIB', '/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib', '/DEFAULTLIB:advapi32.lib','/FIXED:NO', '/dll','/def:%E', '/out:%U', '%F', '%A', '%L', '%B', 
'oldnames.lib', 'user32.lib', 'ws2_32.lib', 'netapi32.lib','advapi32.lib', 
'msvcrt.lib', 'vcruntime.lib', 'ucrt.lib']

链接时会出现以下 11 个错误:

msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __vcrt_initialize referenced in function __scrt_initialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __vcrt_uninitialize referenced in function __scrt_initialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __vcrt_uninitialize_critical referenced in function __scrt_dllmain_uninitialize_critical
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __vcrt_thread_attach referenced in function __scrt_dllmain_crt_thread_attach
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __vcrt_thread_detach referenced in function __scrt_dllmain_crt_thread_attach
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol _is_c_termination_complete referenced in function __scrt_dllmain_uninitialize_c
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_initialize referenced in function __scrt_initialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize referenced in function __scrt_uninitialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize_critical referenced in function __scrt_dllmain_uninitialize_critical
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_attach referenced in function __scrt_dllmain_crt_thread_attach
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_detach referenced in function __scrt_dllmain_crt_thread_detach

这基本上意味着我没有包含所有必要的库。 我已经发现在选项中包含库“libvcruntime.lib”可以将错误减少到 6 个。因此,使用:

link_sl='LINK', '/nologo', '/NOENTRY', '/INCREMENTAL:NO', '/subsystem:console', '/machine:AMD64', 
' /NODEFAULTLIB:LIBC.LIB', '/NODEFAULTLIB:LIBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB', '/DEFAULTLIB:LIBIFCOREMD.LIB', '/DEFAULTLIB:LIBIFPORTMD.LIB', '/DEFAULTLIB:LIBMMD.LIB', '/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib', '/DEFAULTLIB:advapi32.lib','/FIXED:NO', '/dll','/def:%E', '/out:%U', '%F', '%A', '%L', '%B', 
'oldnames.lib', 'user32.lib', 'ws2_32.lib', 'netapi32.lib','advapi32.lib', 
'msvcrt.lib', 'vcruntime.lib', 'ucrt.lib',**'libvcruntime.lib'**]

结果:

msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol _is_c_termination_complete referenced in function __scrt_dllmain_uninitialize_c
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_initialize referenced in function __scrt_initialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize referenced in function __scrt_uninitialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize_critical referenced in function __scrt_dllmain_uninitialize_critical
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_attach referenced in function __scrt_dllmain_crt_thread_attach
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_detach referenced in function __scrt_dllmain_crt_thread_detach

我需要在链接过程中包含哪些其他库来解决这些问题?

【问题讨论】:

您为什么使用/NODEFAULTLIB:LIBC.LIB/NODEFAULTLIB:LIBCMT.LIB 选项?您是如何配置项目的? 坦率地说,我不知道。它们在安装第 3 方软件后作为默认选项出现。我想他们是需要的。 删除它们不会改变任何东西 你为什么要链接 2 CRT's... vcruntime.lib, ucrt.lib 这是强制性的,作为第 3 方软件的默认值 【参考方案1】:

我们遇到了完全相同的问题。通过在visual studio中制作一个简单的控制台项目,我们发现这段代码:

#include <stdio.h>
extern "C" 
    int _is_c_termination_complete(...);
    int __acrt_initialize(...);
    int __acrt_uninitialize(...);



int main()

    if(_is_c_termination_complete())
     
        __acrt_initialize();
    
    fprintf(stdout, "Hello world\n");
    return 0;

反汇编成了这个。

main:
<snip>
00007FF68B44194A  call        __scrt_stub_for_is_c_termination_complete (07FF68B441140h)  
00007FF68B44194F  test        eax,eax  
00007FF68B441951  je          main+38h (07FF68B441958h)  
00007FF68B441953  call        __acrt_initialize (07FF68B441393h)  
00007FF68B441958  mov         ecx,1  
00007FF68B44195D  call        qword ptr [__imp___acrt_iob_func (07FF68B4502F0h)]  
00007FF68B441963  lea         rdx,[string "Hello world\n" (07FF68B449C28h)]  
00007FF68B44196A  mov         rcx,rax  
00007FF68B44196D  call        fprintf (07FF68B44119Ah)  
00007FF68B441972  xor         eax,eax  
00007FF68B441974  lea         rsp,[rbp+0C8h]  
00007FF68B44197B  pop         rdi  
00007FF68B44197C  pop         rbp  

链接器显然将 _is_c_termination_complete 重写为 __scrt_stub_for_is_c_termination_complete。据我们所知,函数 _is_c_termination_complete 不存在于任何特定的 crt 中。不同的 crt 似乎具有不同的实现,链接器似乎会根据您链接的 crt 重写这些实现。

对我们来说,从链接行中删除 /NOENTRY 选项修复了 6 个错误。显然, /NOENTRY 阻止链接器拉入 crt 的实现。

显然,/NOENTRY 实际上意味着没有代码,我们肯定有。

https://docs.microsoft.com/en-us/cpp/build/reference/noentry-no-entry-point?view=vs-2019

【讨论】:

【参考方案2】:

在此第 3 方软件提供的框架内工作时,我遇到了完全相同的问题。虽然我无法直接回答查找包含 _is_c_termination_complete 的库的问题,但我意识到仍然可以使您的代码正常工作:只需将 /FORCE 标志添加到您的 link_sl 标志列表即可。

根据MSVC official documentation:

/FORCE 选项告诉链接器创建一个有效的 .exe 文件或 DLL,即使一个符号被引用但未定义或被多次定义。

因此,LNK2019 错误消息不会阻止链接器生成 dll 库,这对于运行第 3 方软件至关重要。链接器消息如下所示:

msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol _is_c_termination_complete referenced in function __scrt_dllmain_uninitialize_c
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_initialize referenced in function __scrt_initialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize referenced in function __scrt_uninitialize_crt
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_uninitialize_critical referenced in function __scrt_dllmain_uninitialize_critical
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_attach referenced in function __scrt_dllmain_crt_thread_attach
msvcrt.lib(utility.obj) : error LNK2019: unresolved external symbol __acrt_thread_detach referenced in function __scrt_dllmain_crt_thread_detach
 : warning LNK4088: image being generated due to /FORCE option; image may not run
msvcprt.lib(locale0_implib.obj) : warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

这当然不是一个简单的解决方案,也不能保证在任何情况下都能正常工作,但它至少适用于我的代码。

【讨论】:

此答案出现在质量队列中。我认为这不是一个好的答案,但我无权反对它。将来您应该提供一个不会引入额外错误的答案。 @jww 我不得不承认,这更多是为了解决所有者的问题,而不是对他的问题的体面回答。但是,如果仔细比较问题和答案中列出的链接器输出,则不会引入额外的错误。 问题似乎在于第三方的链接器标志。在 MSDN 论坛上查看此内容:unresolved symbols moving C++ MFC-based application to VS2015 from VS2008。 @jww 没错。不幸的是,第三方软件是商业代码,它只为您提供一些预先构建的静态库,API 文档记录不佳。显然,将用户自定义代码链接到这些库并让程序运行是用户的工作。

以上是关于哪个库包含_is_c_termination_complete的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ GC 接口 如何启用它以及包含哪个库

函数 assert() 是干啥的 包含在哪个库中

crypt哪个库linux

我应该在 CodeIgniter 中使用哪个会话库?

opencv中cvCvtColor函数在哪个库

哪个库 - std::chrono::system_clock [关闭]