.error LNK2019: 无法解析的外部符号 "int __cdecl cv::_interlockedExch

reader1 2015-08-20 12:25:31
所有的库配置好了,不用cv空间Mat没有问题,使用cv::Mat出现问题告警......

1>imess.obj : error LNK2019: 无法解析的外部符号 "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z),该符号在函数 "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ) 中被引用
1>icess.obj : error LNK2001: 无法解析的外部符号 "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z)
1>Listen.obj : error LNK2001: 无法解析的外部符号 "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z)
1>.\Debug\imess.dll : fatal error LNK1120: 1 个无法解析的外部命令
1>
发现不少人由此问题,不知道如何解决的?
...全文
7559 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxian_1019 2019-08-21
  • 打赏
  • 举报
回复
引用 14 楼 axjlq 的回复:
为了回答这个这个问题还特意找回密码。。。你看下你的opencv目录下,lib里面一般会有两套dll或者.lib,其中一套后面会有个d,这个d就是debug,你看你自己的截图,debug,win32,那就是说应该用32位的后面带d的dll或者lib文件,这个配置一改应该就可以了
我的这么改了还是不好使
tianxian_1019 2019-08-21
  • 打赏
  • 举报
回复
我还是不明白
axjlq 2019-07-09
  • 打赏
  • 举报
回复 1
为了回答这个这个问题还特意找回密码。。。你看下你的opencv目录下,lib里面一般会有两套dll或者.lib,其中一套后面会有个d,这个d就是debug,你看你自己的截图,debug,win32,那就是说应该用32位的后面带d的dll或者lib文件,这个配置一改应该就可以了
weixin_29013175 2017-04-17
  • 打赏
  • 举报
回复
我也是这个问题,楼主你现在知道怎么解决了吗????
clever101 2016-12-02
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
compile with: /Oi
试过了,这个方法不行。
clever101 2016-12-02
  • 打赏
  • 举报
回复
楼主的问题解决了吗?
meizi57 2016-10-30
  • 打赏
  • 举报
回复
我也遇到了这个问题,不过后来发现是把函数实体注释了。 因此如果是自己写的函数,建议去检查一下函数实体是否准确。 祝好
赵4老师 2016-04-18
  • 打赏
  • 举报
回复
compile with: /Oi
赵4老师 2016-04-18
  • 打赏
  • 举报
回复
Requirements Routine Required header Architecture _InterlockedExchangeAdd <winnt.h> MIPS16, MIPSII, MIPSIII, MIPS IV, MIPS 32
libaosir 2016-04-17
  • 打赏
  • 举报
回复
楼主解决了吗,我也碰到了这个问题,求教
赵4老师 2015-08-21
  • 打赏
  • 举报
回复
仅供参考:
dll 导出函数名的那些事
关键字: VC++  DLL  导出函数 
经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关系。
VC++支持两种语言:即C/C++,这也是造成DLL导出函数差异的根源
我们用VS2008新建个DLL工程,工程名为"TestDLL"
把默认的源文件后缀 .CPP改为.C(C文件)
输入测试代码如下:
01 int _stdcall MyFunction(int iVariant)
02 {
03 return 0;
04 }
为了导出上面这个函数,我们有以下几个方法:
1. 使用传统的模块定义文件 (.def)
新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:
LIBRARY TestDll
EXPORTS
MyFunction
在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"
2. Visual C++ 提供的方便方法
在01行的int 前加入 __declspec(dllexport) 关键字
通过以上两种方法,我们就可以导出MyFunction函数。
我们用Dependency查看导出的函数:
第一种方法导出的函数为:
MyFunction
第二种方法导出的函数为:
_MyFunction@4
__stdcall会使导出函数名字前面加一个下划线,后面加一个@再加上参数的字节数,比如_MyFunction@4的参数(int iVariant)就是4个字节
__fastcall与 __stdcall类似,不过前面没有下划线,而是一个@,比如@MyFunction@4
__cdecl则是始函数名。
小结:如果要导出C文件中的函数,并且不让编译器改动函数名,用def文件导出函数。
下面我们来看一下C++文件
我们用VS2008新建个DLL工程,工程名为"TestDLL"
默认的源文件后缀为 .CPP (即C++文件)。
输入测试代码如下:
01 int _stdcall MyFunction(int iVariant)
02 {
03 return 0;
04 }
为了导出上面这个函数,我们有以下几个方法:
3. 使用传统的模块定义文件 (.def)
新建一个 后缀为.def的文本文件(这里建一个TestDll.Def),文件内容为:
LIBRARY TestDll
EXPORTS
MyFunction
在 Link 时指定输入依赖文件:/DEF:"TestDll.Def"
4. Visual C++ 提供的方便方法
在01行的int 前加入 __declspec(dllexport) 关键字
通过以上两种方法,我们就可以导出MyFunction函数。
我们用Dependency查看导出的函数:
第一种方法导出的函数为:
MyFunction
第二种方法导出的函数为:
?MyFunction@@YGHH@Z
可以看到 第二种方法得到的 导出函数名 并不是我们想要的,如果在exe中用显示方法(LoadLibrary、GetProcAddress)调用 MyFunction 肯定会失败。
但是用引入库(*.LIB)的方式调用,则编译器自动处理转换函数名,所以总是没有问题。
解决这个问题的方法是:
用VC 提供的预处理指示符 "#pragma" 来指定链接选项。
如下:
#pragma comment(linker, "/EXPORT:MyFunction=?MyFunction@@YGHH@Z")
这时,就会发现导出的函数名字表中已经有了我们想要的MyFunction。但我们发现原来的那个 ?MyFunction@@YGHH@Z 函数还在,这时就可以把 __declspec() 修饰去掉,只需要 pragma 指令即可。
而且还可以使如下形式:
#pragma comment(linker, "/EXPORT:MyFunction=_MyFunction@4,PRIVATE")
PRIVATE 的作用与其在 def 文件中的作用一样。更多的#pragram请查看MSDN。
小结:如果要导出C++文件中的函数,并且不让编译器改动函数名,用def文件导出函数。
同时可以用#pragma指令(C 中也可以用)。
总结:
C++编译器在生成DLL时,会对导出的函数进行名字改编,并且不同的编译器使用的改编规则不一样,因此改编后的名字也是不同的(一般涉及到C++ 中的重载等)。
如果利用不同编译器分别生成DLL和访问DLL的exe程序,后者在访问该DLL的导出函数时就会出现问题。如上例中函数MyFunction在C++编译器改编后的名字是?MyFunction@@YGHH@Z。我们希望编译后的名字不发生改变,这里有几种方法。
第一种方法是通过一个称为模块定义文件DEF来解决。
LIBRARY TestDll
EXPORTS
MyFunction
LIBRARY 用来指定动态链接库内部名称。该名称与生成的动态链接库名一定要匹配,这句代码不是必须的。
EXPORTS说明了DLL将要导出的函数,以及为这些导出函数指定的符号名。
第二种是定义导出函数时加上限定符:extern "C"
如:#define DLLEXPORT_API extern "C" _declspec(dllexport)
但extern "C"只解决了C和C++语方之间调用的问题(extern "C" 是告诉编译器,让它按C的方式编译),它只能用于导出全局函数这种情况 而不能导出一个类的成员函数。
同时如果导出函数的调用约定发生改变,即使使用extern "C",编译后的函数名还是会发生改变。例如上面我们加入_stdcall关键字说明调用约定(标准调用约定,也就是WINAPI调用约定)。
#define DLLEXPORT_API extern "C" _declspec(dllexport)
01 DLLEXPORT_API int _stdcall MyFunction(int iVariant)
02 {
03 return 0;
04 }
编译后函数名MyFunction改编成了_MyFunction@4
通过第一种方法模块定义文件的方式DLL编译后导出函数名不会发生改变。
DLL(动态库)导出函数名乱码含义
C++编译时函数名修饰约定规则:
  __stdcall调用约定:
  1、以"?"标识函数名的开始,后跟函数名;

  2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;

  3、参数表以代号表示:
  X--void
  D--char
  E--unsigned char
  F--short
  H--int
  I--unsigned int
  J--long
  K--unsigned long
  M--float
  N--double
  _N--bool
  ....
  PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;
  4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;

  5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。
  其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如
                      int Test1(char *var1, unsigned long)-----"?Test1@@YGHPADK@Z"                      void Test2()-----"?Test2@@YGXXZ"

  __cdecl调用约定:
  规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。
  __fastcall调用约定:
  规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。
  如果要用DEF文件输出一个"C++"类,则把要输出的数据和成员的修饰名都写入.def模块定义文件
  所以...   通过def文件来导出C++类是很麻烦的,并且这个修饰名是不可避免的


reader1 2015-08-21
  • 打赏
  • 举报
回复
是w32. 搜索一下。是很多此类问题。不过都是lib的问题,这里不存在。 改成运行时库编译,出现Zi / clr 冲突问题。
二班的码农 2015-08-20
  • 打赏
  • 举报
回复
可能是库不对,也可能是没有加载库,有些库分为X86和X64版,楼主看看是不是加载错了
二班的码农 2015-08-20
  • 打赏
  • 举报
回复
编译配置也是win32吗?
如果是的话,估计可能是版本兼容的问题,好像之前有人反映,xp不完全兼容vs2010,xp最好用vs2008或之前的版本
reader1 2015-08-20
  • 打赏
  • 举报
回复
引用 1 楼 ant2012 的回复:
可能是库不对,也可能是没有加载库,有些库分为X86和X64版,楼主看看是不是加载错了
vc2010+opencv2.3.1+xp系统。用x86. 附加依赖全部加载。 不用Mat,一起正常!一用Mat就出现上述问题。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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