4

Got stuck with Visual Studio, Assembly and C++

C++:

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

Assembly:

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 

When I build my project, Visual Studio reports the following error:

error LNK1120 error lnk1120 1 unresolved externals 

I actually can't understand what's wrong with this easy part of program.

Log file:

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. 
11
  • 2
    Use extern "C" to turn off name mangling and make sure the leading underscore is expected. Obviously also double check that you are actually linking against the object file created from the assembly ;) Commented Apr 16, 2015 at 13:14
  • @Jester, extern "C" doesn't solve the problem, well maybe something could be wrong with project properties? Commented Apr 16, 2015 at 13:18
  • What version of VC++? AFAIK, they don't support assembly calls after VC++ 2010. Commented Apr 16, 2015 at 13:31
  • @SChepurin, VC++ 2013 Commented Apr 16, 2015 at 13:35
  • 1
    In addition to Olexiy Pyvovarov's answer, you should probably remove the .stack directive, as Visual Studio will create a default stack since there is also a C or C++ source code file as part of the project. Commented Mar 25, 2017 at 13:57

2 Answers 2

1

The actual problem was in the model definition inside assembly source.

.model flat, stdcall - was when the error appears.

.model flat, c - changing to this, works as expected.

Sign up to request clarification or add additional context in comments.

Comments

0

Try to add this line to assembly code - global _asm_calculate_reals - To make it visible to linker. The "global" keyword in assembly tells the assembler to make the label visible from outside the file.

3 Comments

syntax error: global, but actually I found that problem is in stdcall configuration if I change .model flat, stdcall to .model flat, c - everything works perfectly.
glad you found the solution.
@OlexiyPyvovarov, Write your comment as answer & accept it yourself, So that this question can be resolved.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.