1 unresolved external symbol MessageBoxA

gasanot

есть obj файл hw.obj
при попытке link hw.obj -subsystem:windows выдается ошибка
1 unresolved external symbol _MessageBoxA
link hw.obj user32.lib -subsystem:windows не помогает
ml -c -coff hw.asm user32.lib тоже не помогает
Как избавиться от этой ошибки?

voronetskaya

я могу нагнать, но вроде имя функции должно выглядеть MessageBoxA - во всяком случае в user32.dll она именно так экспортируется, без подчеркивания...
link у тебя чей?

gasanot

Линкер микрософтовский. От масма и от VC++6 - работают одинаково и одинаково не хотят линковать.
подчеркивание перед MessageBoxA приделывает компилятор. В исходном тексте подчеркивания нет.
в user32.lib _MessageBoxA с подчеркиванием:


DOS 570194 Col 1175 1% 17:24
12 __imp__TranslateAc12 _>
n12 _M16 __imp__Mes>
4 _GetIn0 __imp__GetInputDes>


Есть ли какая-нибудь утилита для просмотра obj и lib файлов?

gasanot

В сишном исходнике:
Удивительно, но если убрать #include <windows.h> из следующего примера, то _линкер_ начинает выдать ту же ошибку:


D:\temp\1>cl -c hw.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
hw.c
D:\temp\1>link hw.obj user32.lib
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
hw.obj : error LNK2001: unresolved external symbol _MessageBox
hw.exe : fatal error LNK1120: 1 unresolved externals


После раскоментаривания первой строки все идет нормально.
В чем же дело?
код:


// hw.c
//#include <windows.h>
main
{
MessageBox(0, "Hello, world!\n", "fuck", 0);
return 0;
}

Chupa

> Удивительно, но если убрать #include <windows.h>...
Неудивительно.
MessageBox != MessageBoxA и calling conventions наверняка разные.
В заголовке как MessageBox определён?
PS Для просмотра бинарей есть tdump борландовский.

gasanot

>MessageBox != MessageBoxA и calling conventions наверняка разные.
Если в том файле заменить MessageBox на MessageBoxA, то будет то же самое...
Точнее, то же самое будет, если компилировать так как раньше.
Теперь я скомпилировал с опцией -Gz ( __stdcall calling convention) и все заработало без включения windows.h
Непонятно только, почему то же самое для ассемблерного файла не работает.
>PS Для просмотра бинарей есть tdump борландовский
спасибо, пригодился
Оставить комментарий
Имя или ник:
Комментарий: