【问题标题】:Calling C++ Functions in MASM Linker Error在 MASM 链接器错误中调用 C++ 函数
【发布时间】:2021-05-10 20:37:35
【问题描述】:

所以我目前正在尝试从汇编程序运行外部 C++ 函数。我的汇编程序运行正常,但我不断收到链接器错误提示:

“错误 LNK2019 未解析的外部符号 _testFunc@0 在函数 __main@0 中引用”

我想知道为什么会出现这个错误,我认为这是因为我以某种方式错误地将我的 C++ 函数导入到我的 asm 程序中,但我看到其他人以类似的方式这样做。

这是我的汇编代码:

; Created with MASM
.386

.MODEL FLAT, stdcall

.STACK 100h

ExitProcess PROTO, dwExitCode:DWORD

extern testFunc : proto

.CODE
_main PROC

    call testFunc
    xor edi, edi

INVOKE ExitProcess, 0

_main ENDP
END

还有我的 C++ 代码:

#include <iostream>
using namespace std;

extern "C" void _main();

extern "C" void testFunc()
{
    cout << "Hello world";
}

int main()
{
    _main();

    return 0;
}

【问题讨论】:

  • 什么C编译器? MSVC?
  • 如果这是普通的 Windows,foo 的 asm 符号名称是 32 位代码(不是 64 位)的 _foo。所以在 asm 中,你的 _main 定义是定义 C 函数 main,而不是 _main,除非 MASM 正在添加另一个级别的修改。最好选择完全不同的东西,比如asm_main,不会出乎意料地发生冲突。
  • 是的,使用 Visual Studio 社区 2019。即使我改变它,它也会说找不到函数定义“asm_main”。我觉得我缺少理解这一点的基本内容。
  • 哇。我没有返回函数!

标签: c++ assembly visual-c++ x86 masm


【解决方案1】:

您声明.MODEL FLAT, stdcall。你应该定义函数

extern "C" __stdcall void testFunc()

【讨论】:

  • 这不是我在这里做的吗? "extern testFunc : 原型"
  • 你没有做extern testFunc : proto c 和你声明的默认stdcall。
  • 我想我明白你的意思,但是我仍然收到错误消息“符号语言属性冲突:testFunc”。
  • @Suezzeus:不过,这是一个不同的错误;这个答案确实正确修复了 stdcall 函数的符号名称修改(包括@n,返回时弹出的字节数)。
  • 是的,没错。非常感谢您解释这部分。我相信我明白了!我会暂时解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多