2023年6月21日发(作者:)

LNK2019:⽆法解析的外部符号整理⽆法解析的外部符号是Windows下C++编译的常见链接错误,收集整理备忘.本⽂随遇到的问题长期更新我⽬前遇到的错误可以分为3类:1.编译⼯具链修改了对应库函数的定义2.编译参数导致定义和链接库不⼀致3.库依赖冲突4.未导⼊对应库

常见__imp__xxx未定义是因为导出函数前有__declspec(dllimport)对于2,编译参数导致定义和链接库不⼀致下列函数是因为VC编译选项产⽣VC在/MD和/MDd编译选项时会定义_DLL宏,这时STL就定义了__declspec(dllimport),把项⽬(以及第三⽅依赖)的代码⽣成修改为/MT,/MTd即可.#ifndef _ACRTIMP #if defined _CRTIMP && !defined _VCRT_DEFINED_CRTIMP #define _ACRTIMP _CRTIMP #elif !defined _CORECRT_BUILD && defined _DLL #define _ACRTIMP __declspec(dllimport) #else #define _ACRTIMP #endif#endif__imp__strdup,__imp__stricmp,__imp__strspn,__imp_strncpy,__imp_fgets,__imp_strerror_s,__imp_open,__imp_close,__imp_read,__imp_write,__imp_unlink,__imp_wcscpy,__imp_clea__imp_getpid,__imp__wassert(VS2019部分版本编译器,OpenSSL未MT编译)__imp___stricmp,__imp__clearerr,__imp__setbuf,__imp___chmod对于3,库依赖冲突常见是编译选择了静态运⾏时库(多线程(/MT)),然后⼿动添加了动态运⾏时库__except_handler4_common对于4,未导⼊对应库列举常见未定义函数,以及对应库(Windows环境)静态库or LNK2019: ⽆法解析的外部符号__imp__CertCloseStore@8,__imp__CertFreeCertificateContext@4,__imp__CertEnumCertificatesInStore@8,__imp__CertGetEnhancedKeyUsage@16,__imp____imp__ldap_initW,__imp__ldap_sslinitW,__imp__ldap_unbind_s,__imp__ldap_set_optionW,__imp__ldap_simple_bind_sW,__imp__ldap_search___imp__ldap_msgfree,__imp__ldap_err2stringA,__imp__ldap_first_entry,__imp__ldap_next_entry,__imp__ldap_first_attributeW,__imp__ldap_next_attributeW__imp__ldap_get_values_lenW,__imp__ldap_value_free_len,__imp__ldap_get_dnW,__imp__ldap_memfreeW,__imp__ber_free

附录:openssl静态编译参数:32位参数:VC-WIN32调试版本: --debug安装⽬录:--prefix="E:OSPopenssl-1.1.1gWin32"静态库:no-shared// 上述参数任意组合后加在Configure后⾯进⾏配置#⽐如 perl Configure VC-WIN32 --debug no-shared注意:静态库需要额外修改,makefile中的参数,MD(d)改成MT(d)perl Configure VC-WIN32 --debug no-sharednmake

2023年6月21日发(作者:)

LNK2019:⽆法解析的外部符号整理⽆法解析的外部符号是Windows下C++编译的常见链接错误,收集整理备忘.本⽂随遇到的问题长期更新我⽬前遇到的错误可以分为3类:1.编译⼯具链修改了对应库函数的定义2.编译参数导致定义和链接库不⼀致3.库依赖冲突4.未导⼊对应库

常见__imp__xxx未定义是因为导出函数前有__declspec(dllimport)对于2,编译参数导致定义和链接库不⼀致下列函数是因为VC编译选项产⽣VC在/MD和/MDd编译选项时会定义_DLL宏,这时STL就定义了__declspec(dllimport),把项⽬(以及第三⽅依赖)的代码⽣成修改为/MT,/MTd即可.#ifndef _ACRTIMP #if defined _CRTIMP && !defined _VCRT_DEFINED_CRTIMP #define _ACRTIMP _CRTIMP #elif !defined _CORECRT_BUILD && defined _DLL #define _ACRTIMP __declspec(dllimport) #else #define _ACRTIMP #endif#endif__imp__strdup,__imp__stricmp,__imp__strspn,__imp_strncpy,__imp_fgets,__imp_strerror_s,__imp_open,__imp_close,__imp_read,__imp_write,__imp_unlink,__imp_wcscpy,__imp_clea__imp_getpid,__imp__wassert(VS2019部分版本编译器,OpenSSL未MT编译)__imp___stricmp,__imp__clearerr,__imp__setbuf,__imp___chmod对于3,库依赖冲突常见是编译选择了静态运⾏时库(多线程(/MT)),然后⼿动添加了动态运⾏时库__except_handler4_common对于4,未导⼊对应库列举常见未定义函数,以及对应库(Windows环境)静态库or LNK2019: ⽆法解析的外部符号__imp__CertCloseStore@8,__imp__CertFreeCertificateContext@4,__imp__CertEnumCertificatesInStore@8,__imp__CertGetEnhancedKeyUsage@16,__imp____imp__ldap_initW,__imp__ldap_sslinitW,__imp__ldap_unbind_s,__imp__ldap_set_optionW,__imp__ldap_simple_bind_sW,__imp__ldap_search___imp__ldap_msgfree,__imp__ldap_err2stringA,__imp__ldap_first_entry,__imp__ldap_next_entry,__imp__ldap_first_attributeW,__imp__ldap_next_attributeW__imp__ldap_get_values_lenW,__imp__ldap_value_free_len,__imp__ldap_get_dnW,__imp__ldap_memfreeW,__imp__ber_free

附录:openssl静态编译参数:32位参数:VC-WIN32调试版本: --debug安装⽬录:--prefix="E:OSPopenssl-1.1.1gWin32"静态库:no-shared// 上述参数任意组合后加在Configure后⾯进⾏配置#⽐如 perl Configure VC-WIN32 --debug no-shared注意:静态库需要额外修改,makefile中的参数,MD(d)改成MT(d)perl Configure VC-WIN32 --debug no-sharednmake