какая библиотека содержит _is_c_termination_complete - PullRequest
0 голосов
/ 10 января 2019

Я получаю ошибку LNK2019 из-за связывания кода C ++ со стандартной библиотекой C ++. Мне нужно знать, какие библиотеки содержат функции:

  • is_c_termination_complete,
  • __acrt_initialize,
  • __acrt_uninitialize
  • __acrt_uninitialize_critical,
  • __acrt_thread_attach
  • __acrt_thread_detach

чтобы включить его в процесс связывания.

Я пишу код на C ++ для сообщества MS Visual Studio 2017 и Intel Parallel studio xe 2019 update 1 для интеграции в стороннее программное обеспечение. Стороннее программное обеспечение предоставляет опцию «make» для компиляции объектных файлов и связывания их вместе.

Компиляция работает нормально, проблема связана с линковкой.

Стороннее программное обеспечение предоставляет запись для предоставления основных опций компоновщика в виде переменной. Параметры по умолчанию следующие:

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

Какие еще библиотеки мне нужно включить в процесс компоновки, чтобы разрешить их?

1 Ответ

0 голосов
/ 08 мая 2019

Мы столкнулись с точно такой же проблемой. Сделав простой консольный проект в 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 имеют разные реализации, которые компоновщик переписывает в зависимости от того, с кем вы ссылаетесь.

Для нас удаление опции / NOENTRY из строки ссылки исправило 6 ошибок. Очевидно, что / NOENTRY не дает компоновщику использовать реализацию crt.

Видимо, / NOENTRY фактически означает отсутствие кода, который у нас определенно был.

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

...