调用dll,debug正常,release报错“无法定位序数……于动态链接库”

u_lever_2 2019-04-28 04:50:06
我用visual studio 2010 c++编的控制台程序,调用了一个第三方动态链接库gmsh。发布方提供了h,lib和dll文件,只有一个版本,未区分debug/release(后来用depend软件查看过dll,应该是release版)。

采用静态导入的方式调用了这个库,在debug方式下运行正常。但是编译成release后运行报错,dll文件均放在对应的exe路径下。
错误为:无法定位序数1271于动态链接库……xx.exe上

用depend查看了release版exe文件如下,确实发现调用的序数和dll内函数无法对应

另外,在MFC100.dll这里也出现了序数1272



再用depend查看了debug版exe文件如下,似乎没有上面的问题


请问这个问题如何解决?谢谢。
...全文
1846 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2019-05-13
  • 打赏
  • 举报
回复
明明报的是在exe里找不到函数,你去看DLL的导出表做什么? 有这个错误说明函数的声明错了,该用__declspec(dllimport)地方的却用了__declspec(export) (这也会造成LNK2005错误)。至于到底哪个函数错了把你加的那些乱七八糟的编译参数拿掉,再编译一次然后去看编译器报什么错。一般DLL头文件都有#ifdef的,在exe里包含头文件的时候应该让ifdef解释成__declspec(dllimport)(具体怎么干得看头文件里怎么#ifdef的),在DLL编译自己的时候才用__declspec(export)。 编译器就发现的bug,加/Force给编译器消音搞成了一个运行时bug……
u_lever_2 2019-05-11
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
应该是DLL依赖的库版本和开发环境的不一致, VS2010的补丁安装了没?


没有,请问需要安装什么补丁?
xinhaoda 2019-05-06
  • 打赏
  • 举报
回复
这是典型的库没有对应上。 库的名字对应上了,但是库的内容和库的版本与头文件没有对应上,或是库本身内部有错误,都会造成这样的事。
zgl7903 2019-04-28
  • 打赏
  • 举报
回复
应该是DLL依赖的库版本和开发环境的不一致, VS2010的补丁安装了没?
u_lever_2 2019-04-28
  • 打赏
  • 举报
回复
问题初步得到了解决,但机理不明,还请明白的大佬指点

我搜到一个关于调用ffmpeg库中遇到的类似问题
https://blog.csdn.net/machh/article/details/51443361
解决办法是:
vs2010
release 项目属性中-----》连接器----》优化 选项中选择:保留未引用数据
linker-----optimization ----reference--- No (/OPT:NOREF)

这样修改后release编译无法通过,出现了如下类型错误
LNK1179: 无效或损坏的文件: 重复的 COMDAT“?XXX@XXXX”
进一步搜到了帖子
https://www.cnblogs.com/QQ278737076/p/5458592.html
解决办法是:
解决方法:项目右击【属性】 - 【C/C++】 - 【优化】 - 【全程序优化改成】 “否”

release编译通过,正常运行。但我完全不理解这个问题出现的机制是什么,以及我这么修改解决后,是否带来了什么弊端?
u_lever_2 2019-04-28
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
最好是保证exe,dll的运行时库都是一致的,debug,release也都对应好


第三方库并未提供debug版本和release版本,只有一个版本。通过depend查看第三方dll调用的msvcrt等dll,发现文件名没有“D”的后缀,推测是release版本。
oyljerry 2019-04-28
  • 打赏
  • 举报
回复
最好是保证exe,dll的运行时库都是一致的,debug,release也都对应好
u_lever_2 2019-04-28
  • 打赏
  • 举报
回复
补充一下:
关于这个库的调用,一开始时编译是通不过的,显示大量LNK2005重定义错误。搜了下,发现原因很可能是主程序的CRT版本和第三方库的CRT版本不一致导致。解决办法是在链接器的命令行中添加了“/FORCE:MULTIPLE”指令,于是大量的error转为了warning,编译通过了。debug版的程序也可以正确运行了。但目前release版又出现了上面描述的问题。

不知道这两个问题是否有关联

15,474

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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