Obj файлы на топчане или...


Битва за API


Транслятор MASM (входящий, в частности, в состав NTDDK) не выдает не единой ошибки (ну да! еще бы!!! чуть хвост не треснул, пока мы их вылавливали) и генерирует obj-файл. Наступает волнующее время линковки:

$link.exe demo_3.obj

Microsoft (R) Incremental Linker Version 5.12.8181

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

 

LINK:fatal error LNK1221: a subsystem can't be inferred and must be defined

Листинг 2 попытка линковки только что ассемблированного файла

Линкер материться, что подсистема не задана и ни хвоста линковать не хочет. Ну это даже не вопрос! Подсистема задается через ключ /SUBSYSTEM за которым следует одно из следующих ключевых слов: NATIVE — для драйверов, WINDOWS — для GUI приложений, CONSOLE — для консольных приложений, WINDOWSCE — для платформы Windows CE, POSIX – э… ну… это эдакая пародия на UNIX, но все равно ни хрена не работающая.

Фактически выбирать приходится между WINDOWS и CONSOLE. Чем они отличаются? С точки зрения PE-формата, одним битом в заголовке, указывающему системному загрузчику создавать или не создавать консоль при запуске файла. Попытка линковки консольного файла как GUI заканчивается фатально (консоль не создается и весь ввод/вывод обламывается). Обратное не столь плачевно, но пустое консольное окно на фоне GUI выглядит как-то странно. Но мы-то знаем, что наше приложение — консольного типа, следовательно пишем:

 

$link /SUBSYSTEM:CONSOLE demo_3.obj

Microsoft (R) Incremental Linker Version 5.12.8181

Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

 

demo_3.obj:error LNK2001: unresolved external symbol _WriteFile

demo_3.obj:error LNK2001: unresolved external symbol _GetVersion

demo_3.obj:error LNK2001: unresolved external symbol _SetStdHandle

demo_3.obj:error LNK2001: unresolved external symbol _CloseHandle

demo_3.exe:fatal error LNK1120: 40 unresolved externals

Листинг 3 подсистема определена, но линкер не может найти API-функции




Начало  Назад  Вперед



Книжный магазин