错误LNK2019:函数main中引用的未解析的外部符号

时间:2013-12-02 10:42:47

标签: c++ visual-studio-2012 assembly x86-64

我试图用C ++运行我的简单汇编代码。我只有两个文件“.cpp”文件和“.asm”文件。在编译时会出现错误(见下文)。如果有人能提供帮助,我将不胜感激......:)

这是我的“main.cpp”文件

#include <iostream>
using namespace std;

extern "C" int GetValueFromASM(); 

int main(int argc, char *argv[]){

cout<<"value is:"<<GetValueFromASM()<<endl;
cin.get();

return 0;
}

我还有一个简单的“asm.asm”文件

.code
   GetValueFromASM proc
   mov rax,3254
   ret
   GetValueFromASM endp
end

尝试构建时出现此错误:

1>main.obj : error LNK2019: unresolved external symbol GetValueFromASM referenced in             
function main

1>..\visual studio 2012\Projects\AllAssembly\x64\Debug\AllAssembly.exe : fatal error LNK1120: 1 unresolved externals

我尝试过去物业 - > LINKS-&gt;附加图书馆目录并改变路径 但它不起作用。

我也尝试过LINKER-&gt; SYSTEM-&gt; SUBSYSTEM并选择“Windows(/ SUBSYSTEM:WINDOWS)”或 “控制台(/ SUBSYSTEM:CONSOLE)”,但两人都没有工作。任何人都可以帮忙!!很高兴

3 个答案:

答案 0 :(得分:5)

extern“C”表示前导下划线(c风格的函数命名)。只需将您的函数添加到.asm文件中,它就会开始链接。

UPD:如果您的项目没有构建,请确保您包含MASM构建自定义:转到项目上下文菜单 - &gt;构建自定义... - &gt;检查masm的复选框(.targets,.props)。

然后转到.asm文件的属性,并选择项目类型为“Microsoft宏汇编程序”。

答案 1 :(得分:2)

我把它与32位混淆了。 :(

所以这适用于64位。

section .code
global GetValueFromASM

GetValueFromASM:
    ...

答案 2 :(得分:1)

我没有对代码进行任何更改。我只是更改了一些配置,如“Arty”所示。

以下是如何: 右键单击您的项目 - >转到构建自定义 - &gt;检查MASM - &gt;单击确定 然后转到.asm文件的属性,并选择项类型为“Microsoft宏汇编程序”。

你完成!! ...感谢Arty&amp; Devolus的帮助。

对于类似问题可能有帮助: http://scriptbucket.wordpress.com/2011/10/19/setting-up-visual-studio-10-for-masm32-programming/