Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > asm модуль в с++ (error LNK1120)


Автор: binarnik 3.11.2009, 23:10
Помогите плз с проблемкой, хотел привязать асм к с++, но не получилось вот асм модуль:

Код

.586
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
GetStdHandle PROTO nStdHandle:DWORD
SetConsoleTextAttribute PROTO    nStdHandle:DWORD,    nColor:DWORD
.CODE

color PROC x:DWORD
    push ebp
    mov ebp,esp
    
    mov ebx,x
    INVOKE GetStdHandle, -11
    
      INVOKE SetConsoleTextAttribute, eax, ebx
    
    pop ebp
    ret 
color ENDP
    
END 
    


это непосредственно компиляция(батник):

Код

    ml -Zi -c -Fl -coff %1.asm
    if errorLevel 1 goto ml_error
    Link32 %1.obj Lib32/kernel32.lib /SUBSYSTEM:CONSOLE /DEBUG
    if errorLevel 1 goto link_error


с++ код:

Код

#include "stdafx.h"
#include <iostream>
using namespace std;

extern "C" void color(int a);

int _tmain(int argc, _TCHAR* argv[])
{

    color(10);
    
    cout << "\n\nHello WORLD" << endl;


    return 0;
}




скрин ошибки при линковке:

user posted image

в visual studio2008 выскакивает вот такая ошибка:

Код

Компоновка...
test123.obj : error LNK2001: неразрешенный внешний символ "_color"
**\test123.exe : fatal error LNK1120: 1 неразрешенных внешних элементов



Автор: AndNot 5.11.2009, 21:29
Ошибки две.
1. Подпрограмму color необходимо объявить как экспортируемую, т.е. разрешить ее "видимость" линкеру: 
Код
public color
color PROC x:DWORD
....

2. В сишном модуле color объявляется как "C". Это подразумевает, что color будет иметь сишный стиль имени, т.е. _color (добавляется знак подчеркивания перед именем). Но в асме подпрограмма объявлена как STDCALL, поэтому экспортируется без искажения имени. Нужно согласовать: либо объявить color как сишную, либо в сишной проге объявить ее как stdcall.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)