gpt4 book ai didi

c++ - 需要帮助为 JNI 调用构建 DLL。 Unresolved external 引用。 Borland 编译器

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:40 25 4
gpt4 key购买 nike

我需要构建一个 DLL,然后可以从 java 程序中加载 JNI。去年我能够做到这一点,而且效果很好。我现在正在尝试重新编译我的同一个 .cpp 文件,尽管我使用它制作了 dll,但由于引入了包含的 dll 依赖项,它失败了。

我有一个 c++ 程序,它从这里的一些现有 C++ 代码中调用大约 5 个函数。这些函数是一个巨大的代码库的一部分,这些代码库通常都链接在一起以构建一组 5 个 dll。

我使用dependency walker来查看我的dll,去年它编译时只有2个依赖系统dll被放入我的dll中。今天我试图重新编译相同的 dll,但如果我从包含我使用的函数的现有代码库中链接到 .lib 文件,它会带来第三个 dll 文件。

基本上我知道如果我可以避免第三个 dll 出现在我的程序中,我的 dll 将与 JNI 一起正常工作。问题是我不知道如何在不链接到 lib 文件的情况下从我们现有的代码库中引用我的代码中需要的函数。

我可以让它与标准的 c++ 文件和方法一起工作。只有当我从我们庞大的代码库中引用这个预先存在的代码时,才会出现这个问题。

如果我没有将我的 .obj 文件与我们代码中的 .lib 文件链接,我会从我必须使用的 Borland 5.5 编译器中获得未解析的引用消息。

总体问题是当我从 c++ exe 文件调用它时,我的 dll 文件工作正常,但 Java 无法处理其中的某些内容。此外,如果我将代码编译成 unix 中的 .so 文件而不是 windows dll,Java JNI 可以正常工作并且可以加载它。我知道这个问题与 Windows 如何使用 dll 有关,而且我知道如果这个 3rd dll 没有作为我的 dll 的一部分加载它也可以工作。我只是不知道我去年做了什么来构建我的 dll 而没有将第三个显示为依赖项。

如果我从我们现有的代码中注释掉函数,它可以很好地编译并加载,因为第三个 dll 依赖项没有放入我的 dll 中。

更多细节

我收到一条关于缺少 _strcopy 的消息,因此我在 cw32mti.lib 文件中进行了链接,但它消失了,但随后 cw32mti.dll 出现在我的 dll 文件中。如何防止缺少类似的引用消息并防止它将 dll 放入我的 dll 中?

我的链接命令如下所示。
ilink32 mydll.obj, mydll.dll,,cw32mti

我让其他缺少的引用工作的唯一方法是将其他 dll 添加到我的链接命令中,例如:
ilink32 mydll.obj, mydll.dll,,cw32mti.lib other.lib

other.dll 包含我从 mydll.dll 调用的函数,例如calculate(int a, int b),所以我的代码有一个链接,比如calculate(num1, num2);问题是当我使用包含计算方法的库时,它还引入了链接到我不想加载的 other.dll 的其他 dll。我需要能够在不将 other.dll 添加到 mydll.dll 的情况下调用 calculate(num1, num2)。这在没有动态调用计算和使用 getprocaddress 类型的编码之前工作。

更新 - 我最终不得不放弃让 windows dll 与 smartheap 内存管理器一起工作。由于此代码是在 unix 中部署的,因此我能够构建 .so 文件并让它们与 JNI 一起使用。对于 Windows dll 编译,我在导致 smartheap dll 被加载的 JNI 代码周围放置了一些条件编译器语句,因此当它在 Windows 中编译时它不使用该代码。相反,我只是让它打印出一条声明,说它没有在 Windows 中执行。

我们后来也遇到了让我们的 64 位 JBoss 服务器运行和加载这些 32 位 .so 文件的问题。我最终在 64 位服务器旁边运行了一个并行 JBoss 服务器,并调用了在 32 位 JBoss 实例上引用 32 位库的方法。

它可能会在以后演变成更多,但现在这项任务在我们尝试了许多不同的事情几个月后正在为我们工作。我感谢这里的所有帮助和输入。

最佳答案

如果您可以使用去年构建的应用程序 DLL,请使用 TDUMP查看模块依赖项是什么。 (您可能必须分析所有的 DLL 以获得良好的图像。)然后努力在新的 DLL 中重现它,可能通过调整链接器的配置 .DEF文件。

如果您的问题中没有显示任何代码或 .DEF 文件,很难更具体。

关于c++ - 需要帮助为 JNI 调用构建 DLL。 Unresolved external 引用。 Borland 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com