【问题标题】:Linker error while trying to use assembler code in cpp module尝试在 cpp 模块中使用汇编代码时出现链接器错误
【发布时间】:2016-07-11 23:50:42
【问题描述】:

我正在使用 Visual Studio 2013 并尝试运行简单的 nasm 代码。

main.cpp:

#include "Header.h"
void _printf() {
    printf("HELLO\n");
}

int main()
{
    sayHello();
    return 0;
}

Header.h:

#include <stdio.h>

void _printf();

extern "C" {
    void sayHello();
}

和 asm 文件 hello.asm:

SECTION .text

EXTERN _printf

global sayHello
sayHello:
    push ebx
    call _printf
    pop ebx
ret

之后我收到以下错误:

Error   1   error LNK2019: unresolved external symbol _sayHello referenced in function _main    c:\Users\art.mhtr\documents\visual studio 2013\Projects\ConsoleApplication8\ConsoleApplication8\main.obj    ConsoleApplication8

【问题讨论】:

    标签: c++ c visual-studio assembly nasm


    【解决方案1】:

    如果您阅读错误消息,您将看到它找不到的函数名为_sayHello。注意前面的下划线。

    要解决您的问题,您必须使用前导下划线命名您的汇编函数:

    global _sayHello
    _sayHello:
        ...
    

    【讨论】:

    • 我仍然在运行时遇到错误。程序只是崩溃
    • 要拨打您的_printf,您需要使用call __printf。或者,恢复到原始代码并使用nasm --prefix _
    • 它说'__printf'是未定义的
    • 您还需要将您的_printf 设为extern C,否则它的名称将被 c++ 损坏。
    • @Artyom:我强烈建议您为_printf 使用一个不太容易混淆的名称。从您的 asm 代码中,我假设您正在尝试使用垃圾参数调用 C 标准库 printf。 (这就是发生的事情,顺便说一句,以及您的程序链接但随后崩溃的原因。)
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2022-10-02
    • 2019-10-29
    • 2020-02-23
    • 2015-10-17
    相关资源
    最近更新 更多