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



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

C++

#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;
}

Asm

.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  

尝试运行此操作将导致:

多次指定LNK4042(警告(对象,忽略额外的(asm对象文件(

LNK2019(错误(函数_main(asm对象文件(中引用的未解析外部符号_addInts

随后,由于未解决的外部(解决方案可执行(,以致命错误LNK1120的形式进行了最后的反抗行为

我正在将Visual Studio 2019与MSVC v142和MASM一起使用。我的另一个自包含的汇编代码没有任何问题,我编写的另一项涉及从C++读取x86中的int数组的函数运行良好。我真的看不出这里出了什么问题,如果是我的代码有问题,或者是一些深奥的设置,或者完全是其他什么问题。

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

解决方案文件在链接器设置中没有定义入口点,这就是我在C++中调用asm的最后一段代码中所做的。

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

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

注意到.cpp文件和.asm文件具有相同的名称(IntegerAddition.cppIntegerAddition.asm(后,此问题得到了解决。

将程序集文件重命名为其他文件解决了此问题。

最新更新