当前位置: 首页 > news >正文

vs2013 32位 编译的 dll,重新用vs2022 64位编译,所遇问题记录

目录

一、vs2013 32 DLL 转 VS2022 64 DLL 所遇问题

1、 LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900”

2、原先VS2013   现在 VS2022   导致的vsnprintf 重定义问题

3、 无法解析的外部符号 __vsnwprintf_s

4、无法解析的外部符号__imp__CertFreeCertificateContext

5、无法解析的外部符号__iob_func

6、LNK1218: 警告被视为错误 - 没有生成“object”文件

 7、end()找不到

8、使用64位openssl库

9、优化策略 或 运行时库 尽量一致


本打算用VS2013 编译64位的,结果 集成到vs2022 中时,因为所用的C++标准不同,因此导致不兼容,只能用VS2022 重新编译下,期间 编译优化策略也要保持一致,这里都禁止优化。

一、vs2013 32 DLL 转 VS2022 64 DLL 所遇问题

1、 LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900”

You are trying to link objects compiled by different versions of the compiler. That’s not supported in modern versions of VS, at least not if you are using the C++ standard library. Different versions of the standard library are binary incompatible and so you need all the inputs to the linker to be compiled with the same version. Make sure you re-compile all the objects that are to be linked.

The compiler error names the objects involved so the information the question already has the answer you are looking for. Specifically it seems that the static library that you are linking needs to be re-compiled.

你在尝试着将编译自不同版本编译器的对象链接起来。在现代版本的 VS 中这是不被支持的,至少在你使用了 C++ 标准库之后就不支持了。不同版本的标准库之间是二进制不兼容的,因此你需要使用统一版本的编译器来编译其所有的输入文件。请你需要链接的对象都全部重新编译了。

使用VS2022 重新编译下

_MSC_VER 为 1800,对应了 Visual Studio 2013

2、原先VS2013   现在 VS2022   导致的vsnprintf 重定义问题

 

在宏定义处,加上编译版本选择

#if defined(_MSC_VER)&&_MSC_VER<1900#define snprintf			_snprintf#define vsnprintf			_vsnprintf#define vsnwprintf        _vsnwprintf
#endif

3、 无法解析的外部符号 __vsnwprintf_s

 error LNK2019: 无法解析的外部符号 __vsnwprintf_s

原因:vs2015以上 默认编译时将许多标准库采用内联方式处理,因而没有可以链接的标准库文件,所以要专门添加标准库文件来链接标准库中的函数

工程->右键属性->链接器->输入->附加依赖项       添加 legacy_stdio_definitions.lib 

4、无法解析的外部符号__imp__CertFreeCertificateContext

因为openssl库使用了windows的一个密码学库: Crypt32

也把它加上

Crypt32.lib
legacy_stdio_definitions.lib


 

5、无法解析的外部符号__iob_func

在 VS2015 以上中 __iob_func 改成了 __acrt_iob_func,所以代码中需要增加一个名为 __iob_func 转换函数

在头文件中,

添加转换函数

#if _MSC_VER>=1900  
#include "stdio.h"   
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus   
extern "C"
#endif   
FILE* __cdecl __iob_func(unsigned i) {return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */  

6、LNK1218: 警告被视为错误 - 没有生成“object”文件

已经设置了否,还是有这个错误

后来发现,连接器哪里 还有个链接器 警告视为错误

 

 7、end()找不到

改为 : std::map<_Kty, _Ty>::end()

template<typename _Kty=size_t,typename _Ty=void*>
class CSafeMap: protected std::map<_Kty,_Ty>
{CMyMutex m_mutex;
public:typedef	int(*ENUM_SAFE_MAP)(_Kty,_Ty,void*);_Ty lockedFind(_Kty seq) {_Ty p=0;typename std::map<_Kty,_Ty>::iterator it=std::map<_Kty,_Ty>::find(seq);
#ifdef _WIN32if(it!= std::map<_Kty, _Ty>::end()) {
#elseif(it!=std::map<_Kty,_Ty>::end()) {
#endifp=it->second;}return p;}void lockedAdd(_Kty seq,_Ty p) {
#ifdef _WIN32std::map<_Kty, _Ty>::insert(std::make_pair(seq,p));
#elsestd::map<_Kty,_Ty>::insert(std::make_pair(seq,p));
#endif}_Ty lockedRemove(_Kty seq) {_Ty p=0;typename std::map<_Kty,_Ty>::iterator it=std::map<_Kty,_Ty>::find(seq);
#ifdef _WIN32if(it!= std::map<_Kty, _Ty>::end()) {
#elseif(it!=std::map<_Kty,_Ty>::end()) {
#endifp=it->second;
#ifdef _WIN32std::map<_Kty, _Ty>::erase(it);
#elsestd::map<_Kty,_Ty>::erase(it);
#endif}return p;}

8、使用64位openssl库

一开始编译很多错误,后来意识到,可能使用的openssl库,是32位的,所以网上又找了64位的编译后,才走上正轨。

9、优化策略 或 运行时库 尽量一致

如果还有问题,可以将dll 、目标工程,采用同样的优化策略

还不行的话,运行库 可设置为一样 后试试

, 

 

http://www.lryc.cn/news/98328.html

相关文章:

  • Linux_CentOS_7.9部署Docker以及镜像加速配置等实操验证全过程手册
  • 强引用和弱引用
  • tp6 实现excel 导入功能
  • 【C++】类和对象(中篇)
  • 大数据处理架构详解:Lambda架构、Kappa架构、流批一体、Dataflow模型、实时数仓
  • 双指针解决n数之和问题
  • 安全学习DAY07_其他协议抓包技术
  • electron的electron-packager打包运行和electron-builder生产安装包过程,学透 Electron 自定义 Dock 图标
  • 【无标题】深圳卫视专访行云创新马洪喜:拥抱AI与云原生,深耕云智一体化创新
  • jenkins通过流水线进行构建jar包
  • Android开发:通过Tesseract第三方库实现OCR
  • 合并两个有序链表——力扣21
  • 企业数据,大语言模型和矢量数据库
  • LabVIEW使用支持向量机对脑磁共振成像进行图像分类
  • kafka面试题
  • 树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)
  • JVM系统优化实践(22):GC生产环境案例(五)
  • DevOps系列文章 之GitLabCI模板库的流水线
  • spring扩展点ApplicationContextAware解释
  • 力扣热门100题之最大子数组和【中等】【动态规划】
  • 导出为PDF加封面且分页处理dom元素分割
  • 【C++入门】浅谈类、对象和 this 指针
  • 【Linux命令200例】indent对C语言代码进行缩进和格式化
  • Hive 调优集锦(1)
  • 【C++详解】——智能指针
  • Jmeter接口/性能测试,Jmeter使用教程(超细整理)
  • 59,综合案例-演讲比赛流程管理系统
  • 前端JS 展示上传图片缩略图(本地图片读取)
  • Vue中$route和$router的区别
  • 基于多任务学习卷积神经网络的皮肤损伤联合分割与分类