lib的使用还和编译器的版本有关?检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1900”

bandaoyu 2019-05-18 09:20:35

原来lib的使用还和 VS的版本有关!

源码编译成lib之后,不就是“二进制程序数据”和一个 “函数符号表” 吗? 为什么还和“_MSC_VER”有关呢?

今天用VS2017 编译程序,引用一个VS2010 编译出来的lib,结果竟然报错:检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1900”

实在让人难以理解。
...全文
1427 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2019-05-31
  • 打赏
  • 举报
回复
引用 18 楼 丁劲犇 的回复:
太赞了,学到好多东西!!!! “在DLL里分配的内存也要在DLL里销毁”,有时候分配内存用完之后才能销毁,你这句话的意思是:分配内存和销毁内存的接口都要在DLL里面实现,然后分配和销毁都必须要成对的使用 DLL中的接口 对吧,这个确实以前没注意,真是太有用了
  • 打赏
  • 举报
回复
另外,在DLL里分配的内存也要在DLL里销毁,反之亦然。跨编译器后,free、malloc一般是两套东西。
如果需要C模拟C++,一般采用这样的形式:

1、把原来的导出类class变成 struct。
2、所有函数都添加第一个参数,为 struct *
3、如果需要分配很多初始化的东西,加入两个函数:

struct MyBar * new_MyBar(...);

ReleaseMyBar(struct MyBar * _This);

//原来的MyBar::foo(paras)函数:
void foo(struct MyBar * _This, paras);


  • 打赏
  • 举报
回复
引用 16 楼 bandaoyu 的回复:
引用 15 楼 丁劲犇 的回复:
[quote=引用 8 楼 bandaoyu的回复:][quote=引用 6 楼 丁劲犇 的回复:]
C的标准 各家编译器都是一样的,但是C++的标准各家却不一样?

对的,用xxx.c 而不是xxx.cpp编译。[/quote]不错,学到很多知识,还有什么需要注意的吗[/quote]

很多细碎的东西。比如,如果有字符串参数,在VC下需要导出 wchar、char两种版本的函数。因为,字符转换对于DLL的用户来说很头大。
建议,准备两个版本的函数:
char funA(char * p)

wchar_t funW(wchar_t * p)


而后在头文件中定义:

#ifdef UNICODE
#define fun funW
#else
#define fun funA
#end

事实上WindowsAPI就是这样的。PS,Linux没有这么麻烦,Linux都是 UTF-8的,而且可以调用 icu 转换。

  • 打赏
  • 举报
回复
引用 19 楼 bandaoyu 的回复:
[quote=引用 18 楼 丁劲犇 的回复:]
太赞了,学到好多东西!!!!

“在DLL里分配的内存也要在DLL里销毁”,有时候分配内存用完之后才能销毁,你这句话的意思是:分配内存和销毁内存的接口都要在DLL里面实现,然后分配和销毁都必须要成对的使用 DLL中的接口 对吧,这个确实以前没注意,真是太有用了[/quote]
不客气! 是指只要统一即可,比如,DLL申请的就在DLL释放,外面的就在外面,传入指针即可
bandaoyu 2019-05-29
  • 打赏
  • 举报
回复
引用 15 楼 丁劲犇 的回复:
引用 8 楼 bandaoyu的回复:
[quote=引用 6 楼 丁劲犇 的回复:]
C的标准 各家编译器都是一样的,但是C++的标准各家却不一样?

对的,用xxx.c 而不是xxx.cpp编译。[/quote]不错,学到很多知识,还有什么需要注意的吗
bandaoyu 2019-05-21
  • 打赏
  • 举报
回复
引用 7 楼 赵4老师 的回复:
dumpbin.exe都不会用吗?
老大dumpbin.exe 这个 在我这个问题 能解决哪个疑问 怎么解决呀? 就是怎么用它 能得到什么信息 老大 救救我 呜呜
bandaoyu 2019-05-21
  • 打赏
  • 举报
回复
引用 6 楼 丁劲犇 的回复:
C的标准 各家编译器都是一样的,但是C++的标准各家却不一样?
赵4老师 2019-05-21
  • 打赏
  • 举报
回复
dumpbin.exe都不会用吗?
  • 打赏
  • 举报
回复
lib里的符号,只有C的才是兼容的。
导出符合C的规范的符号:
1、cpp的话,使用 extern "C" 描述,或者直接用C
2、_stdcall,规范和其他语言的多参数入栈顺序。
3、使用DEF文件进行导出表罗列。

这样的话,是可以直接被各种编译器调用的。反过来,C++会对函数的名字进行变换,不保证跨编译器兼容性。因此,Linux下、Windows下很多开源库都是C的接口的。

建议你下载一个dep walker 看看dll里的符号列表
  • 打赏
  • 举报
回复
引用 8 楼 bandaoyu的回复:
引用 6 楼 丁劲犇 的回复:
C的标准 各家编译器都是一样的,但是C++的标准各家却不一样?
对的,用xxx.c 而不是xxx.cpp编译。
bandaoyu 2019-05-21
  • 打赏
  • 举报
回复
引用 12 楼 赵4老师 的回复:
你以为向下兼容很容易吗?你行你来干。
是不是动态库 就没有版本的问题
bandaoyu 2019-05-21
  • 打赏
  • 举报
回复
引用 12 楼 赵4老师 的回复:
你以为向下兼容很容易吗?你行你来干。
今天赵老大真人来了,不是机器人顶替
赵4老师 2019-05-21
  • 打赏
  • 举报
回复
你以为向下兼容很容易吗?你行你来干。
bandaoyu 2019-05-21
  • 打赏
  • 举报
回复
引用 10 楼 赵4老师 的回复:
A品牌的 汽车轮胎螺钉的ISO标准是 160mm, V1900款的新车有个轮胎螺钉坏了,V1600款的老车上有,而且都遵询标准160mm,可以拿下来用到V1900款新车上。

问题来了,lib为什么没有一个标准,以后的不管怎么升级,只要标准不变或者向下兼容即可
赵4老师 2019-05-21
  • 打赏
  • 举报
回复
今天修2017款发动机,想换一个2010款发动机里面得零件,结果竟然报错:检测到“零件尺寸”的不匹配项: 值“160mm”不匹配值“190mm” 实在让人难以理解。
棉猴 2019-05-20
  • 打赏
  • 举报
回复
应该是向下兼容的吧?
走好每一步 2019-05-20
  • 打赏
  • 举报
回复
引用 楼主 bandaoyu 的回复:
原来lib的使用还和 VS的版本有关! 源码编译成lib之后,不就是“二进制程序数据”和一个 “函数符号表” 吗? 为什么还和“_MSC_VER”有关呢? 今天用VS2017 编译程序,引用一个VS2010 编译出来的lib,结果竟然报错:检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1900” 实在让人难以理解。
是的,lib跟编译器版本有关系,你要跨版本,你就用动态链接库的 动态链接办法
bandaoyu 2019-05-20
  • 打赏
  • 举报
回复
人呢?
bandaoyu 2019-05-20
  • 打赏
  • 举报
回复
引用 4 楼 走好每一步 的回复:
[quote=引用 3 楼 棉猴 的回复:]
应该是向下兼容的吧?


动态库的符号文件lib 没有说向下兼容的说法[/quote]
原来这样,怪不得github 从来不提供静态库下载,最多提供linux的动态库.so 文件,级别都是需要自己下载源码生成库,是不是就是因为这个原因。
走好每一步 2019-05-20
  • 打赏
  • 举报
回复
引用 3 楼 棉猴 的回复:
应该是向下兼容的吧?
动态库的符号文件lib 没有说向下兼容的说法

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧