【问题标题】:MSVC++ compile only / disable linker仅 MSVC 编译器/禁用链接器
【发布时间】:2011-04-17 14:32:35
【问题描述】:

我需要编译一些将使用 JNI 从 Java 调用的 C++ 代码,并且这些 C++ 函数必须调用一个汇编函数(使用 NASM 汇编),因此由 JNI 加载的 .dll 中的 C++ 函数只是用于大会职能。

但在代码被编译成 .dll 之前,我无法解析对 Assembly 函数的未定义外部引用,我可以将其与 NASM 生成的 .obj 文件链接。那么,如何“禁用”链接器,以便在构建 C++ 模块时不会有任何投诉?

【问题讨论】:

  • 您需要构建静态/动态库或那里的任何名称。
  • 您使用的是哪个 C++ 编译器,哪个版本?您是从 IDE 还是从命令行构建代码?
  • 真正的问题是你不能用 C++ 代码链接你的 NASM 库,对吧?
  • 安德烈,没错。我无法链接 NASM 和 C++ 代码。我正在使用 Microsoft Visual C++ 2010,并且正在从 IDE 构建 C++ 代码。
  • Dahse Frederic 的回答是正确的。以后,请更具体地提出问题,因为您提供了许多不必要的细节,使问题变得模糊。

标签: java c++ assembly java-native-interface


【解决方案1】:

要链接 NASM 生成的 obj 文件,请打开 C++ 项目的属性,选择 Configuration Properties > Linker > Input,然后将 obj 文件添加到 Additional Dependencies 列表(以分号分隔)。

【讨论】:

  • 它声称我的 func.obj 文件已损坏,您将如何使用 NASM 生成 .obj 文件?
  • @Benjamin,Visual Studio 2010 链接器仅支持其自己的 COFF 目标文件格式变体。显然,您需要将 -f win32 选项传递给 NASM(而不是 -f coff)才能获得该格式的目标文件。
  • 啊,非常感谢:)。但我仍然在链接时收到“未解析的外部符号”错误。这是输出: func.obj : error LNK2001: unresolved external symbol _sum 1>crash.obj : error LNK2019: unresolved external symbol "int __cdecl sum(int,int)" (?sum@@YAHHH@Z) 在函数中引用_Java_Crash_sum@16
  • @Benjamin,这看起来像是调用约定不匹配。 asm 文件中使用的 .model 指令是什么?大多数时候,在 C++ 端,您应该选择 __stdcall 而不是 __cdecl
  • NASM 没有 .model 指令。这是 func.asm: _sum: push ebp mov ebp, esp mov eax, [ebp+8] mov ecx, [ebp+12] add eax, ecx pop ebp ret
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多