错误 LNK2019:在主函数中引用了未解决的外部符号

6
我正在尝试在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

我尝试进入“属性-链接-附加库目录”并更改路径,但它没有起作用。
我也尝试进入“链接器-系统-子系统”,选择“Windows (/SUBSYSTEM:WINDOWS)”或“Console (/SUBSYSTEM:CONSOLE)”,但两者都没有起作用。有人可以帮忙吗?非常感谢!
3个回答

6

extern "C"意味着前导下划线(C式函数命名)。只需在.asm文件中为您的函数添加前缀即可开始链接。

更新:如果您的项目无法构建,请确保您已经包含了MASM构建自定义项:转到项目上下文菜单 -> 构建自定义项... -> 选中masm (.targets, .props)的复选框。

然后转到您的.asm文件的属性,选择Item Type为“Microsoft Macro Assembler”。


我尝试将函数名从GetValueFromASM更改为_GetValueFromASM,但仍然不起作用! - 105tNoMatter
请看我的更新 - Visual Studio 2012 默认不包含 MASM 构建自定义设置 - 您需要启用它们。 - Arty
@105t无论如何,你应该接受对你有用的答案。 - eis
@Arty,所有事情都做完了,但仍然出现相同的错误,VC++ 2013。 - Olexiy Pyvovarov
@OlexiyPyvovarov,你用的是x86还是x64?能否提供一些你masm代码的片段? - Arty
@Arty,是的,我解决了我的问题。我使用的是x86架构和VS2013。问题在于主模块是cpp,而asm是次要的。我选择了“.model flat, stdcall”,导致出现错误,改为“.model flat, c”就可以了。 - Olexiy Pyvovarov

2
我把它和32位搞混了。 :(
所以,这应该适用于64位。
section .code
global GetValueFromASM

GetValueFromASM:
    ...

我尝试将函数名从 "GetValueFromASM" 改为 "_GetValueFromASM",但没有成功,您能解释一下替代方法吗?我的意思是,您所说的“标记该程序为 C”是什么意思?谢谢。 - 105tNoMatter
你试过这个吗?将函数名设为全局的?你使用哪个汇编器? - Devolus
我还在困境中..你能否给我完整的“asm.asm”新版本,并建议我应该做哪些更改。@Devolus - 105tNoMatter
我不确定你的环境是否设置正确,所以这里有一个链接详细解释了它:http://www.sciencezero.org/index.php?title=How_to_write_x64_assembly_functions_in_Visual_C%2B%2B - Devolus
谢谢,我会看一下的。 - 105tNoMatter
显示剩余2条评论

1

我没有对代码做任何更改。我只是像“Arty”建议的那样更改了一些配置。

以下是操作步骤: 右键单击您的项目->转到“生成自定义” ->选中MASM ->单击确定 然后转到您的.asm文件的属性,并将项目类型选择为“Microsoft Macro Assembler”。

你完成了!感谢Arty和Devolus的帮助。

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


VisualStudio 2008(我想后续版本也是)有一个很好的功能,即您不需要自定义构建步骤。只需创建一个空的asm文件或使用现有文件,并在项目中使用“添加现有项”。然后它会自动提供构建步骤配置。我使用它,因为这比自己设置更方便。 :) - Devolus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接