2010-03-20 34 views
3

也就是说,一个DLL名称在结尾处有一个额外的@ 8,这引起了麻烦。显然,在gcc中使用--kill-at标志可以解决这个问题,但是我找不到任何类似的MSVC建议。有没有一个Visual C++相当于gcc --kill-at?

编辑:阿多一点信息:

我试图让C++ JNI DLL的工作,但我不断地得到 异常在线程“线程0” java.lang.UnsatisfiedLinkError中:eveTimers.PollThread .checkKeyboardChanges()V 回来代替功能程序。我用quickview查看dll,发现它用@ 8装饰,http://www.velocityreviews.com/forums/t143642-jni-unsatisfied-link-error-but-the-method-name-is-correct.html暗示这是一个可能的问题。帮助将不胜感激。

+0

你解决了你的问题吗?如果没有,你有没有JNI DLL的源代码?你建立它了吗? – 2010-03-20 03:50:41

+0

问题解决了。必须清理和一些随机的摆弄,让编译按我讲的方式运行。 – seurimas 2010-03-21 03:43:36

+0

你的开始句子会为我节省一天的编码,如果我先读它:-P – fommil 2013-08-24 23:10:27

回答

1

[编辑为无关紧要,每个评论如下]。

另一种方法是specify export names in a .DEF file

您的调用约定和链接器设置也会影响到这一点。说实话,这是一种黑色艺术。使用MSVC十几年了,你仍然偶尔会遇到讨厌的名字 - 修复问题,应该很容易修复,但是在实际修复时不是很平常,因为不同的设置如何交互。

+0

只有.DEF文件可以让你完全防止混乱。其他方法将stdcall函数和前缀_加到cdecl函数后缀@(参数的字节数)。 – 2010-03-20 03:26:16

+0

当然,这并不那么简单。有些情况下,您可以使用.DEF文件路径,并发现您的名字仍在被破坏。一如既往的解决这类问题的解决方案是真正理解MSVC链接阶段 - 根据我的经验,对于接近其他环境的人来说,这是一个不平凡的主张。 – 2010-03-20 03:33:35