【问题标题】:Call Assembly procedure from C++ code using Visual Studio使用 Visual Studio 从 C++ 代码调用组装过程
【发布时间】:2015-04-16 13:12:01
【问题描述】:

被 Visual Studio、Assembly 和 C++ 卡住了

C++:

extern "C" void asm_calculate_reals();
int main()
{
   asm_calculate_reals();
   return 0;
}

组装:

PUBLIC _asm_calculate_reals
.386
.model flat, stdcall
option casemap :none
.stack 100h
.code
_asm_calculate_reals PROC
   ;code goes here
   ret
_asm_calculate_reals ENDP
end

当我构建我的项目时,Visual Studio 报告以下错误:

error LNK1120 error lnk1120 1 unresolved externals

我实际上无法理解这个简单的程序部分有什么问题。

日志文件:

Build started 16.04.2015 16:53:21.
     1>Project "somepath\Reals loop 3variants.vcxproj" in node 2 (targets Build).
     1>Link:
         somepath\link.exe /ERRORREPORT:PROMPT /OUT:"somepath\Debug\Reals loop 3variants.exe" /INCREMENTAL /NOLOGO somelibs /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"somepath\Debug\Reals loop 3variants.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"somepath\Debug\Reals loop 3variants.lib" /MACHINE:X86 /SAFESEH:NO Debug\main.obj
         Debug\reals.obj
     1>main.obj : error LNK2019: reference to the unresolved external symbol _asm_calculate_reals in function _main
     1>somepath\Debug\Reals loop 3variants.exe : fatal error LNK1120: unresolved identifiers: 1
     1>Building project "somepath\Reals loop 3variants.vcxproj" finished (targets Build) with errors.

Build failed.

【问题讨论】:

  • 使用extern "C" 关闭名称修改并确保需要前导下划线。显然还要仔细检查您是否实际上链接到从程序集创建的目标文件;)
  • @Jester,extern "C" 不能解决问题,也许项目属性有问题?
  • 什么版本的VC++? AFAIK,他们不支持 VC++ 2010 之后的程序集调用。
  • @SChepurin,VC++ 2013
  • 除了 Olexiy Pyvovarov 的回答之外,您可能应该删除 .stack 指令,因为 Visual Studio 将创建一个默认堆栈,因为项目中还有一个 C 或 C++ 源代码文件。

标签: c++ assembly


【解决方案1】:

实际问题出在程序集源中的模型定义中。

.model flat, stdcall - 是错误出现的时候。

.model flat, c - 改成这个,按预期工作。

【讨论】:

    【解决方案2】:

    尝试将此行添加到汇编代码 - global _asm_calculate_reals - 使其对链接器可见。汇编中的“global”关键字告诉汇编器使标签从文件外部可见。

    【讨论】:

    • syntax error: global,但实际上我发现如果我将 .model flat, stdcall 更改为 .model flat, c,则问题出在 stdcall 配置中 - 一切正常。
    • 很高兴您找到了解决方案。
    • @OlexiyPyvovarov,写下你的评论作为答案并自己接受,这样这个问题就可以解决了。
    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多