文章目录

小结

碰到了OpenSSL加入到在Visual Studio 2019中编译返回LNK2019错误,添加了缺失的库文件,解决了问题。

问题和解决

Error LNK2019

错误有类似以下返回:

Severity  Code  Description  Project  File  Line  Suppression State
Error LNK2019 unresolved external symbol _BUF_MEM_new referenced in function "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl SimpleWeb::Crypto::Base64::encode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?encode@Base64@Crypto@SimpleWeb@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV45@@Z)
Error LNK2019 unresolved external symbol BIO_ctrl referenced in function "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl SimpleWeb::Crypto::Base64::encode(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?encode@Base64@Crypto@SimpleWeb@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV45@@Z)

在Visual Studio 2019中编译返回LNK2019错误这个问题比较难解决,根据网上经验,尝试了多种解决办法都没有用。
大体有三种解决思路,如下:

  • 函数只声明了没进行定义
    仔细检查了项目的文件,并没有发现没有定义的情况。
  • 编译平台没有选对
    尝试更改了X86和X64的平台,并没有解决问题。
  • 相应的库没有添加到工程中来
    看来看去也看不出具体是哪个库缺失,根据多方查找验证,发现应该是与OpenSSL有关的库。

尝试了在​​工程属性​​​–> ​​C/C++​​​ --> ​​Code Generation​​​ --> ​​Runtime Library​​进行更改:

  • Multi-threaded (/MT)
  • Multi-threaded Debug (/MTd)
  • Multi-threaded DLL (/MD)
  • Multi-threaded Debug DLL (/MDd)
    以上四个选项进行了切换,发现都不行。

参考:Visual Studio 2019配置OpenSSL 3.0开发环境

在​​工程属性​​​–> ​​Linker​​​ --> ​​Input​​​ --> ​​Additional Dependencies​​添加以下库文件:

  • openssl.lib
  • libcrypto.lib
  • libssl.lib
    问题解决。
    我先前安装了​​​Win64OpenSSL-3_0_5.msi​​,工程文件里都添加了包含目录和库目录,但是还是要在以上设置里添加这三个库。

Error LNK1104

在​​工程属性​​​–> ​​C/C++​​​ --> ​​Code Generation​​​ --> ​​Runtime Library​​进行更改的时候,会报LNK1104的错误。

  • Multi-threaded (/MT)
  • Multi-threaded Debug (/MTd)
  • Multi-threaded DLL (/MD)
  • Multi-threaded Debug DLL (/MDd)

​LNK1104 cannot open file 'libboost_date_time-vc142-mt-sgd-x64-1_70.lib'​​​,实际在目录里是有​​libboost_date_time-vc142-mt-gd-x64-1_70.lib​​​,少了个​​s​​​, 运行库需要的库还不一样,如果拷贝一份,再进行改名,加上个​​s​​, 也是能编译的。

Warning C4996

有关C4996警告,已经设置了​​project properties -> Configuration Properties -> C/C++ -> General -> SDL checks -> No​​,还是不行。

直接把​​#pragma warning(disable : 4996)​​放在代码前面进行了屏蔽。

最后,直接忽略了​​warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data​​。

参考

Visual Studio 2019配置OpenSSL 3.0开发环境​​​

​Stack Overflow: LNK1104 cannot open file ‘libboost_log-vc142-mt-gd-x64-1_72.lib’?​

​VS2012 error C2019, error link2019:无法解析的外部符号​​​

【error LNK2019: unresolved external symbol】问题解决方案

​​Error LNK2019:Unresolved External Symbol 的解决方案

​Unresolved external symbol in object files​​​​Why does Visual Studio 2013 error on C4996?​