VC链接时提示找不到动态库的函数.

我是大当家 2009-09-03 09:47:03
情况是这样的:
1-我创建了一个动态库按照 extern "C" + __cdecl的组合通过export方式导出,目的是使导出接口名没有任何改编.达到目的.
2-但是在使用的时候遇到问题,使用时通过extern "C" + __cdecl的方式导入,链接是提示error LNK2001: unresolved external symbol _AddCounter.
查阅资料证实,这种情况是正确的.在c编译和c调用约定下就是在函数名前加个下划线.但是这样与导出的接口名就不一致了.不知道我查的资料对不对,这样的话不合理啊.
请问这个该如何解决?





...全文
329 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qrlvls 2009-09-04
  • 打赏
  • 举报
回复
extern "C" 以后不要再 __cdecl
Ghost90 2009-09-04
  • 打赏
  • 举报
回复
静态加载要你的dll的一个lib文件,加到被调用的工程的link里
入你的动态库是test.dll要把 test.lib 加exe工程里
我是大当家 2009-09-04
  • 打赏
  • 举报
回复
ChamPagneZ:我没有看错.加了extern "C"是会改编,但是和__cdecl一起使用就不再改编了.本来应该导出16个函数,但是导出了14个.已经导出的14都是名字没有改编的.我说的是调用模块试图去lib里找带下划线的函数名,所以找不到.现在原因已经清楚,是确实没有导出这几个函数.至于为什么没有导出还是个疑问.
我是大当家 2009-09-04
  • 打赏
  • 举报
回复
因为使用dllexport,有4个函数无法导出.分别为DelCounter/RemoveAgent/StartAgent/StopAgent.非常奇怪,尝试使用def解决这个问题 .使用def文件可以全部导出,应该是哪个地方与vc冲突了.导致漏了四个.暂时绕过了问题,还请各位继续指教.
ChamPagneZ 2009-09-04
  • 打赏
  • 举报
回复
我肯定你没看书仔细.
微软的编译器,即使加了extern "C"也是会改编(核心编程里面有这句话).
你的实验印证了这点.
我是大当家 2009-09-04
  • 打赏
  • 举报
回复
哎,终于知道为什么找不到了.因为动态库中根本没有导出.刚才无意发现导出函数少 了四个.但是我已经在生活函数的饿前面加了__declspec(dllexport),其他函数也是同样的处理方式,为什么只有这四个没有导出呢?
我是大当家 2009-09-04
  • 打赏
  • 举报
回复
还请各位老大多多指教啊.如果哪位同学也遇到过这个问题就好了.
我是大当家 2009-09-04
  • 打赏
  • 举报
回复
WaistCoat16:输出函数是没有经过改名的.另外静态加载使用dll的头文件改名与否没有关系.
qrlvls:extern "C"+__cdecl是为了使导出的函数不改名.extern "C"表示使用c编译,__cdecl表示使用c调用,两个并不冲突啊.这样用是没有问题的.另外因为__cdecl使用vc的默认调用约定,我是定义函数时没有另外说明.

Ghost90:自然是已经加到link里的objcts/library modules里面了.dll也已经拷贝到debug下了.lib文件已经拷贝到调用模块的当前目录下.

wltg2001:使用dll的函数声明的头文件的话,里面是不同使用dllimport宏定义的,使用后会在函数名前面加上__imp,如__imp__add**();可能是与使用模块的宏定义哪冲突了..去掉后正常.但是还是多了下划线.


我改成动态加载后,有一个函数漏掉了.今天发现,却是可以正常调用的.很奇怪.我又试着直接使用其他的函数,还是提示找不到_FunName.现在任务紧,过几天,回头好好研究一下.
wltg2001 2009-09-04
  • 打赏
  • 举报
回复
一般来说,只要你在DLL中声明的函数声明和引用程序中用的函数声明一致就不会有问题,当然export可以改为import
Ghost90 2009-09-03
  • 打赏
  • 举报
回复
动态加载用
LoadLibrary("DLL.dll")
sanguomi 2009-09-03
  • 打赏
  • 举报
回复
新建了一个例子,使用相同方法导出,静态加载,并使用dll的头文件,怎么玩都可以.可是在另外个工程里怎么玩都不转.疯了鸟!!还是疯了VC?明眼人给条活路啊.

那个DLL你放在哪个路径?
WaistCoat16 2009-09-03
  • 打赏
  • 举报
回复
用depends查看下你的导出函数名是啥

你可以通过def的方式导出就不会被改名了
我是大当家 2009-09-03
  • 打赏
  • 举报
回复
再详细点:在调用动态库函数时c编译+c调用约定,对函数名前面加下划线修饰.但是使用
dllexport导出时,c编译+c调用约定产生的是没有任何修饰的函数名.这个矛盾怎么解决?
我试了在使用的头文件中也就上dllexprot还是产生带下划线的调用名称.
我是大当家 2009-09-03
  • 打赏
  • 举报
回复
新建了一个例子,使用相同方法导出,静态加载,并使用dll的头文件,怎么玩都可以.可是在另外个工程里怎么玩都不转.疯了鸟!!还是疯了VC?明眼人给条活路啊.

无奈先使用动态加载,dll调试过了再回头慢慢研究这个.
我是大当家 2009-09-03
  • 打赏
  • 举报
回复
动态加载应该没有问题,我现在验证静态加载,希望可以解决这个问题,同事以前也是这么弄,没出现这么怪的情况,我猜想重点可能是vc的哪个地方没有设置好.正常尝试.

15,471

社区成员

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

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