C++ 多次指定的对象-从C+;调用asm代码时未解析的外部符号+;

C++ 多次指定的对象-从C+;调用asm代码时未解析的外部符号+;,c++,x86,C++,X86,我在.asm文件中有一些x86代码,我正试图从C++中使用它: C++ 尝试运行此操作将导致: 多次指定LNK4042(警告)对象,忽略附加(asm对象文件) LNK2019(错误)未解析的外部符号\u在函数\u main(asm对象文件)中引用的附加项 随后是由于未解决的外部(解决方案可执行文件)导致的致命错误LNK1120形式的最终违抗行为 我正在将VisualStudio2019与MSVCV142和MASM一起使用。我的另一个独立的汇编代码没有问题,我写的另一个函数,包括从C++中读取x8

我在.asm文件中有一些x86代码,我正试图从C++中使用它:

C++

尝试运行此操作将导致:

多次指定LNK4042(警告)对象,忽略附加(asm对象文件)

LNK2019(错误)未解析的外部符号\u在函数\u main(asm对象文件)中引用的附加项

随后是由于未解决的外部(解决方案可执行文件)导致的致命错误LNK1120形式的最终违抗行为

我正在将VisualStudio2019与MSVCV142和MASM一起使用。我的另一个独立的汇编代码没有问题,我写的另一个函数,包括从C++中读取x86中的int数组的工作很好。我真的看不出这里出了什么问题,如果这是我的代码、一些深奥的设置或完全其他的问题

如果我将Asm代码的最后一行更改为
END addInts
,那么程序将运行并立即退出,
std::cout
中没有任何内容

解决方案文件没有链接点设置中定义的入口点,这是我为C++最后一条代码ASM所做的。

asm文件包含在使用Microsoft宏汇编程序的生成中


文件被设置为C++,以防万一。

注意到<代码> > CPP < /C>文件>代码>。ASM< /COD>文件具有相同的名称(<代码>整数加法。CPP < /代码>和<代码>整数加法。ASM< /代码>)。
将程序集文件重命名为其他文件解决了此问题。

如何调用编译器和链接器(或将IDE配置为这样做)?这是您的问题中缺少的信息,但调查您的问题是必需的。我正在使用Visual Studio调试器(F5)运行它。我没有想到要包括它,这是我运行所有其他代码的方式,没有问题。我希望这能回答你的问题,我对这类事情的处理还不够精确。至于构建设置等等,它都是为x86设置的,带有/MACHINE:x86标志。另外:如果我尝试在没有调试器(Ctrl-F5)的情况下运行它,我会收到相同的错误显示ML.EXE的命令行(可以在.asm文件属性中看到)。您是否根据?
ml.exe/c/nologo/Zi/Fo“Debug\IntegerAddition.obj”/Fl”“/W3/errorReport:prompt/Ta
”添加了该文件,该文件是默认文件,与以前工作过的其他asm文件相同。我将其添加到项目中的方式与您的链接中描述的方式几乎相同,只是使用Win32而不是x64Yes,因为两者都将被编译成
IntegerAddition.obj
。我对自己没有尽早看到这一点有些失望,但这是完全正确的。有趣的事实:
gcc
对于单行程序构建命令没有这个问题。您可以毫无问题地执行
gcc foo.cfoo.S-o foo
;它为
.o
文件使用临时文件名。
#include <iostream>

extern "C" int addInts(int a, int b);

int main() {
    
    int a = 1;
    int b = 2;

    int result = addInts(a, b);

    std::cout << "Result :\t" << result << std::endl;

    return 0;
}
.386
.MODEL  FLAT,   C

.CODE

addInts     PROC

    PUSH    EBP
    MOV     EBP,    ESP

    MOV     EAX,    [EBP+8]
    MOV     ECX,    [EBP+12]

    ADD     EAX,    ECX

    POP     EBP

    RET


addInts     ENDP
END