errorLNK2019无法解析的外部符号
#程序员# #IT# #IT教育#
近期编译librime,使用yaml-cpp,出现下面的链接错误:。 config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::Emitter::Emitter(class std::basic_ostream > &)" (__imp_??0Emitter@YAML@@QAE@AAV?$basic_ostream@DU?$char_traits @D@std@@@std@@@Z),函数 "public: bool __thiscall rime::ConfigData::SaveToStream(class std::basic_ostream > &)" (?SaveToStream@ConfigData@rime@@QAE_NAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@@Z) 中引用了 该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::Emitter::~Emitter(void)" (__imp_??1Emitter@YAML@@QAE@XZ),函数 "public: bool __thiscall rime::ConfigData::SaveToStream(class std::basic_ostream > &)" (?SaveToStream@ConfigData@rime@@QAE_NAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class YAML::Emitter & __thiscall YAML::Emitter::SetLocalValue(enum YAML::EMITTER_MANIP)" (__imp_?SetLocalValue@Emitter@YAML@@QAEAAV12@W4EMITTER_MANIP@2@@Z),函数 "vo id __cdecl rime::EmitScalar(class std::basic_string,class std::allocator > const &,class YAML::Emitter *)" (?EmitScalar@rime@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PA VEmitter@YAML@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class YAML::Emitter & __thiscall YAML::Emitter::Write(class std::basic_string,class std::allocator > const &)" (__imp_?Wr ite@Emitter@YAML@@QAEAAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),函数 "void __cdecl rime::EmitScalar(class std::basic_string,class std::allocator > const &,class YAML: :Emitter *)" (?EmitScalar@rime@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVEmitter@YAML@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::BadConversion::BadConversion(struct YAML::Mark const &)" (__imp_??0BadConversion@YAML@@QAE@ABUMark@1@@Z),函数 "public: __thiscall YAML::TypedBadCon version,class std::allocator > >::TypedBadConversion,class std::allocator > >(struct YAML::Mark const &)" (??0?$TypedBadConversion@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@YAML@@QAE@ABUMark@1@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::BadConversion::BadConversion(class YAML::BadConversion const &)" (__imp_??0BadConversion@YAML@@QAE@ABV01@@Z),函数 "public: __thiscall YAML::TypedBa dConversion,class std::allocator > >::TypedBadConversion,class std::allocator > >(class YAML::TypedBadConv ersion,class std::allocator > > const &)" (??0?$TypedBadConversion@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@YAML@@QAE@ABV01@@Z) 中引用了该符号 [D:librime-m asterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::Node::Node(void)" (__imp_??0Node@YAML@@QAE@XZ),函数 "public: struct YAML::detail::iterator_value const __thiscall YAML::detail::iterator_base::operator*(void)const " (??D?$iterator_base@$CBUiterator_value@detail@YAML@@@detail@YAML@@QBE?BUiterator_value@12@XZ) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::Node::Node(class YAML::Node const &)" (__imp_??0Node@YAML@@QAE@ABV01@@Z),函数 "public: struct YAML::detail::iterator_base::proxy __thiscall YAML::detail::iterator_base::operator->(void)const " (??C?$iterator_base@$CBUiterator_value@detail@YAML@@@detail@YAML@@QBE?AUproxy@012@XZ) 中引用了该符号 [D:lib rime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall YAML::Node::~Node(void)" (__imp_??1Node@YAML@@QAE@XZ),函数 "public: __thiscall YAML::detail::iterator_value::~iterator_value(void)" (??1iterator_value@de tail@YAML@@QAE@XZ) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: struct YAML::Mark __thiscall YAML::Node::Mark(void)const " (__imp_?Mark@Node@YAML@@QBE?AU02@XZ),函数 "public: class std::basic_string,class std::allocator > __thiscall YAML::Node::as,class std::allocator > >(void)const " (??$as@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Nod e@YAML@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class YAML::detail::iterator_base __thiscall YAML::Node::begin(void)const " (__imp_?begin@Node@YAML@@QBE?AV?$iterator_ base@$CBUiterator_value@detail@YAML@@@detail@2@XZ),函数 "class std::shared_ptr __cdecl rime::ConvertFromYaml(class YAML::Node const &,class rime::ConfigCompiler *)" (?ConvertFromYaml@rime@@YA?AV?$shared_ptr@VConfi gItem@rime@@@std@@ABVNode@YAML@@PAVConfigCompiler@1@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: class YAML::detail::iterator_base __thiscall YAML::Node::end(void)const " (__imp_?end@Node@YAML@@QBE?AV?$iterator_base @$CBUiterator_value@detail@YAML@@@detail@2@XZ),函数 "class std::shared_ptr __cdecl rime::ConvertFromYaml(class YAML::Node const &,class rime::ConfigCompiler *)" (?ConvertFromYaml@rime@@YA?AV?$shared_ptr@VConfigIte m@rime@@@std@@ABVNode@YAML@@PAVConfigCompiler@1@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) private: __thiscall YAML::Node::Node(enum YAML::Node::Zombie)" (__imp_??0Node@YAML@@AAE@W4Zombie@01@@Z),函数 "public: struct YAML::detail::iterator_value const __thiscall Y AML::detail::iterator_base::operator*(void)const " (??D?$iterator_base@$CBUiterator_value@detail@YAML@@@detail@YAML@@QBE?BUiterator_value@12@XZ) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxp roj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) private: __thiscall YAML::Node::Node(class YAML::detail::node &,class std::shared_ptr)" (__imp_??0Node@YAML@@AAE@AAVnode@detail@1@V?$sh ared_ptr@Vmemory_holder@detail@YAML@@@std@@@Z),函数 "public: struct YAML::detail::iterator_value const __thiscall YAML::detail::iterator_base::operator*(void)const " (??D?$iterator_base@$CBUite rator_value@detail@YAML@@@detail@YAML@@QBE?BUiterator_value@12@XZ) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) class YAML::Node __cdecl YAML::Load(class std::basic_istream > &)" (__imp_?Load@YAML@@YA?AVNode@1@AAV?$basic_istream@DU?$char_traits@D@ std@@@std@@@Z),函数 "public: bool __thiscall rime::ConfigData::LoadFromStream(class std::basic_istream > &)" (?LoadFromStream@ConfigData@rime@@QAE_NAAV?$basic_istream@DU?$char_traits@D@std@@@std@@@Z) 中引用 了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) class YAML::Node __cdecl YAML::LoadFile(class std::basic_string,class std::allocator > const &)" (__imp_?LoadFile@YAML@@YA?AVNode @1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),函数 "public: bool __thiscall rime::ConfigData::LoadFromFile(class std::basic_string,class std::allocator > const &,class rime ::ConfigCompiler *)" (?LoadFromFile@ConfigData@rime@@QAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAVConfigCompiler@2@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] config_data.obj : error LNK2001: 无法解析的外部符号 "public: __thiscall YAML::BadConversion::BadConversion(class YAML::BadConversion const &)" (??0BadConversion@YAML@@QAE@ABV01@@Z) [D:librime-masterbuildsrcrime.vcxproj] libboost_regex-vc142-mt-x32-1_74.lib(regex_traits_defaults.obj) : error LNK2019: 无法解析的外部符号 __imp__towupper,函数 "unsigned short __fastcall boost::re_detail_107400::do_global_upper(unsigned short)" (?do_global_upper@re_detail_107400@boost@ @YIGG@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___stricmp,函数 "class std::basic_string,class std::allocator > * __cdecl google::CheckstrcasecmpfalseImpl(char const *,char const *,char const *)" (?CheckstrcasecmpfalseImpl@google@@YAPAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBD00@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp__perror,函数 "public: virtual void __thiscall google::`anonymous namespace"::LogFileObject::Write(bool,__int64,char const *,unsigned int)" (?Write@LogFileObject@?A0x248eae43@google@@U AEX_N_JPBDI@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___fdopen,函数 "private: bool __thiscall google::`anonymous namespace"::LogFileObject::CreateLogfile(class std::basic_string,class std::allocator > const &)" (?CreateLogfile@LogFileObject@?A0x248eae43@google@@AAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___pclose,函数 "bool __cdecl google::SendEmailInternal(char const *,char const *,char const *,bool)" (?SendEmailInternal@google@@YA_NPBD00_N@Z) 中引用了该符号 [D:librime-masterbuildsrcrim e.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___popen,函数 "bool __cdecl google::SendEmailInternal(char const *,char const *,char const *,bool)" (?SendEmailInternal@google@@YA_NPBD00_N@Z) 中引用了该符号 [D:librime-masterbuildsrcrime .vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp__unlink,函数 "private: bool __thiscall google::`anonymous namespace"::LogFileObject::CreateLogfile(class std::basic_string,class std::allocator > const &)" (?CreateLogfile@LogFileObject@?A0x248eae43@google@@AAE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] OLDNAMES.lib(unlink.obi) : error LNK2001: 无法解析的外部符号 __imp__unlink [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___difftime64,函数 "private: class std::vector,class std::allocator >,class std::allocator,class std::allocator > > > __thiscall google::`anonymous namespace"::LogCleaner::GetOverdueLogNames(class std::basic_string,class std::allocator >,unsigned in t,class std::basic_string,class std::allocator > const &,class std::basic_string,class std::allocator > const &)const " (?GetOverdueLogNames@LogCleaner@?A 0x248eae43@google@@ABE?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@ @5@IABV65@1@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___mktime64,函数 "public: __thiscall google::LogMessageTime::LogMessageTime(struct tm)" (??0LogMessageTime@google@@QAE@Utm@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(logging.obj) : error LNK2019: 无法解析的外部符号 __imp___access,函数 "void __cdecl google::GetExistingTempDirectories(class std::vector,class std::allocator >,class std::all ocator,class std::allocator > > > *)" (?GetExistingTempDirectories@google@@YAXPAV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$bas ic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z) 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(utilities.obj) : error LNK2019: 无法解析的外部符号 __imp___getpid,函数 "void __cdecl google::glog_internal_namespace_::`dynamic initializer for "g_main_thread_pid""(void)" (??__Eg_main_thread_pid@glog_internal_namespace_@google@@YAXXZ) 中引 用了该符号 [D:librime-masterbuildsrcrime.vcxproj] glog.lib(vlog_is_on.obj) : error LNK2019: 无法解析的外部符号 __imp____stdio_common_vsscanf,函数 _sscanf 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] OLDNAMES.lib(unlink.obi) : error LNK2001: 无法解析的外部符号 __imp___unlink [D:librime-masterbuildsrcrime.vcxproj] MSVCRT.lib(chandler4gs.obj) : error LNK2019: 无法解析的外部符号 __except_handler4_common,函数 __except_handler4 中引用了该符号 [D:librime-masterbuildsrcrime.vcxproj] D:librime-masterbuildlibReleaserime.dll : fatal error LNK1120: 31 个无法解析的外部命令 [D:librime-masterbuildsrcrime.vcxproj]
链接找不到符号,无法解析的外部符号,一般是头文件对应的库没有,或者库版本不对,库的Debug或release模式不匹配,原理知道,但是实际的环境查找很复杂,本例里,用cmake在控制台里编译出错,在VS里编译照样出错,我也尝试补充环境,但是没有解决问题。
后来按照作者的Windows下编译流程,按步骤原封不动处理,就没有这要的错误了。步骤第一步里用git下载环境非常重要,我是自己下载的zip组织出来的代码,不知道哪里匹配不了,就出错了。用开源一定要看好说明,要找和环境匹配的说明,比如Windows下和Linux下是2个环境,要用不同的处理方式。