【问题标题】:error LNK2019: unresolved external symbol referenced in function main错误 LNK2019:函数 main 中引用的未解析的外部符号
【发布时间】:2013-12-18 00:59:04
【问题描述】:

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

我尝试转到 PROPERTIES->LINKS->ADDITIONAL LIBRARY DIRECTORIES 并更改路径 但它没有用。

我也试过去 LINKER->SYSTEM->SUBSYSTEM 并选择 "Windows (/SUBSYSTEM:WINDOWS)" 或 “控制台(/SUBSYSTEM:CONSOLE)”,但没有一个工作。谁能帮忙!!..非常感谢

【问题讨论】:

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


    【解决方案1】:

    我没有对代码进行任何更改。我只是按照“Arty”的建议更改了一些配置。

    方法如下: 右键单击您的项目->转到构建自定义->检查MASM->单击确定 然后转到 .asm 文件的属性并选择 Item Type 作为“Microsoft Macro Assembler”。

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

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

    【讨论】:

    • VisualStudio 2008(我也会假设更高版本)具有这个不错的功能,您无需自定义构建步骤。只需创建一个空的 asm 文件或使用现有文件并在项目中使用“添加现有项”。然后它会自动提供构建步骤配置。我使用它是因为它比自己设置更方便。 :)
    【解决方案2】:

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

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

    然后转到 .asm 文件的属性并选择项目类型为“Microsoft Macro Assembler”。

    【讨论】:

    • 我尝试将函数名称从 GetValueFromASM 更改为 _GetValueFromASM ..但也没有用!
    • 查看我的更新 - 默认情况下,Visual Studio 2012 不包括 MASM 构建自定义 - 您必须启用它们。
    • @105tNoMatter 你应该接受对你有用的答案
    • @Arty,一切都完成了,但仍然出现同样的错误,VC++ 2013
    • @OlexiyPyvovarov,您使用的是 x86 还是 x64?你能从你的masm代码中提供一些sn-ps吗?
    【解决方案3】:

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

    所以这应该适用于 64 位。

    section .code
    global GetValueFromASM
    
    GetValueFromASM:
        ...
    

    【讨论】:

    • 我尝试将函数名称从 GetValueFromASM 更改为 _GetValueFromASM ..但它没有用,你能解释一下替代方法吗..我的意思是你的意思是“将 proc 标记为 C”..thnx
    • 你试过了吗?使函数名称全局化?你用的是哪个汇编器?
    • 我还是有麻烦的人..你能给出“asm.asm”的完整新版本,建议我应该做的改变吗?@Devolus
    • 您使用的是哪个汇编程序?是吗?而且你的 C 项目也是 64 位的?
    • 是的,我宣布它是全球性的……我使用 Visual Studio 2012(我想这是你问的,因为我混淆了汇编器和编译器)……如何知道它是否是 yasm/masm 等?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多