Аватар для Tot
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 132
1

Ошибка при компановке программы "fatal error LNK1104"

29.08.2012, 13:07. Показов 6859. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь.

Запускаю через qeditor, встроенный в masm32 файл winurl.asm командой "project/assemble asm file"
На выходе получаю объектный файл winurl.obj. Тут всё нормально.

Далее запускаю через тот же qeditor команду "project/link obj file" и в консоли выскакивает ошибочка:
"link: fatal error LNK1104: cannot open file "shell32.lib"".
Пути к папке bin, include, lib, папке с исходником в системной переменной path прописаны. Не понятно.
Ладно, перебрасываю в папку с исходником из папки lib пакета masm32 файл shell32.lib и остальные включаемые командой include файлы.
Далее проделываю те же команды в qeditor... Вот результат:

winurl.obj: error LNK2001: unresolved external symbol __imp__ExitProccess@4
winurl.exe: fatal error LNK1120: 1 unresolved externals

Смысл ошибки я понимаю - не хватает одной внешней переменной __imp__ExitProccess@4. Как её включить?

В общем:
1. Как настроить path так, чтобы компилировать файлы в свободной папке типа "D:\assembler\files" ?
2. Как включить внешнюю переменную __imp__ExitProccess@4 ?

Вот как я прописал пути в переменной path:

d:\masm32\;
d:\assembler\files;
d:\masm32\lib;
d:\masm32\include;
d:\masm32\examples;
d:\masm32\plugins;
d:\masm32\procs;
d:\masm32\script;
d:\masm32\bin;
d:\masm32\datetime;
d:\masm32\fpulib;
d:\masm32\m32lib;
d:\masm32\macros;
d:\masm32\vkdebug;

А вот сам код программулины:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; winurl.asm
; Пример программы для win32.
; Запускает установленный по умолчанию браузер на адрес, указанный в строке URL.
; Аналогично можно запускать любую программу, документ или какой угодно файл,
; для которого определена операция open.
;
include shell32.inc
include kernel32.inc
    .386
    .model flat
    .const
URL db  "http://kubik-rubika.net",0
    .code
_start:        ; Метка точки входа должна начинаться с подчёркивания.
    xor         ebx,ebx
    push        ebx             ; Для исполняемых файлов - способ показа.
    push        ebx             ; Рабочая директория.
    push        ebx             ; Командная строка.
    push        offset URL      ; Имя файла с путём.
    push        ebx             ; Операция open или print (если NULl - open).
    push        ebx             ; Идентификатор окна, которое получит сообщения.
    call        ShellExecute    ; ShellExecute (NULL,NULL,url,NULL,NULL,NULL).
    push        ebx             ; Код выхода.
    call        ExitProccess    ; ExitProccess (0)
end _start
Это код shell32.inc:


Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; shell32.inc
; Включаемый файл с определениями функций из shell32.dll
ifdef       _TASM_
            include     import32.lib
                    ; Имена используемых функций.
                    extrn   ShellExecuteA:near
                    ; Присваивания для облегчения читаемости кода.
            ShellExecute    equ     ShellExecuteA
else
            includelib      shell32.lib
                    ; Истинные имена используемых функций.
                    extrn   __imp__ShellExecuteA@24:dword
                    ; Присваивания для облегчения читаемости кода.
            ShellExecute    equ     __imp__ShellExecuteA@24
endif
0
29.08.2012, 13:07
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2012, 13:07
Ответы с готовыми решениями:

Ошибка при компиляции программы "fatal error A1000: cannot open file : /masm32/include/windows.inc"
.486 .model flat, stdcall include /masm32/include/windows.inc include /masm32/include/user32.inc include...

Ошибка : fatal error LNK1104: cannot open file "kernel32.lib"
Не могу исправить ошибку: --------------------Configuration: ilyha - Win32 Debug-------------------- Linking... LINK : fatal error...

Ошибка LINK : fatal error LNK1104: cannot open file "mfc42ud.lib"
Как утранить ошибку? при компиляции выдает ее, microsoft visual c++ 6.0 LINK : fatal error LNK1104: cannot open file...

4
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16347 / 7664 / 1077
Регистрация: 11.11.2010
Сообщений: 13,720
30.08.2012, 04:36 2
Tot, создаешь единственный файл
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.386
.model flat,stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
extern _imp__ShellExecuteA@24:dword
extern _imp__ExitProccess@4:dword
.const
URL db  "http://kubik-rubika.net",0
    .code
start: xor         ebx,ebx
    push        ebx             ; Для исполняемых файлов - способ показа.
    push        ebx             ; Рабочая директория.
    push        ebx             ; Командная строка.
    push        offset URL      ; Имя файла с путём.
    push        ebx             ; Операция open или print (если NULl - open).
    push        ebx             ; Идентификатор окна, которое получит сообщения.
    call _imp__ShellExecuteA@24    ; ShellExecute (NULL,NULL,url,NULL,NULL,NULL).
    push        ebx             ; Код выхода.
    call  _imp__ExitProccess@4    ; ExitProccess (0)
end start
и собираешь его bat-файлом
ActionScript 3
1
2
\masm32\bin\ml /c /coff "winurl.asm"
\masm32\bin\Link /SUBSYSTEM:WINDOWS "winurl.obj"
1
 Аватар для Tot
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 132
30.08.2012, 16:05  [ТС] 3
Mikl___, да я сделал так. Но при переходе из obj в exe такой ответ в консоли:

winurl.obj : error LNK2001: unresolved external symbol __imp__ExitPRoccess@4
winurl.exe : fatal error LNK1120: 1 unresolved externals

То есть всё равно есть неопределённая переменная. Как это исправить?

Добавлено через 1 час 21 минуту
С компоновкой какая-то беда. Через masm32 вообще возможно собирать 16-битные asm-ки?
Например, хочу собрать такую ммленькую игру по книге Зубкова:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
; lifedir.asm
; Игра "Жизнь" на поле 320х200, использующая вывод на экран средствами BIOS.
 
    .model  small
    .stack  100h        ; Явное задание стека для EXE-программ.
    .code
    .186
start:
    push    FAR_BSS     ; Сегментный адрес буфера в DS.
    pop ds
 
; Заполнение массива ячеек псевдослучайными значениями.
    xor ax,ax
    int 1Ah     ; Функция AH = 0 INT 1 Ah: Получить текущее
                ; время.
                ; DX теперь содержит число секунд,
                ; прошедших с момента включения компьютера,
                ; которое используется как начальное значение
                ; генератора случайных чисел.
    mov di,320*200+1    ; Максимальный номер ячейки.
fill_buffer:
    imul    dx,4E35h    ; Простой генератор случайных чисел
    inc dx      ; из двух команд.
    mov ax,dx       ; Текщее случайное число копируетсяв AX,
    shr ax,15       ; от него оставляется только один бит,
    mov byte ptr [di],al; и в массив копируется 00, если ячейка
                ; пуста, и 01 - если заселена.
    dec di      ; Следующая ячейка.
    jnz fill_buffer ; Продолжить цикл, если DI не стал равен нулю.
 
    mov ax,0013h    ; Графический режим 320*100, 256 цветов.
    int 10h
 
; Основной цикл.
 
new_cycle:
 
; Шаг 1: для каждой ячейки вычисляется число соседей
; и записывается в старшие 4 бита этой ячейки.
 
    mov di,320*200+1    ; Максимальный номер ячейки.
 
step_1:
    mov al,byte ptr [di+1]  ; В AL вычисляется сумма
    add al,byte ptr [di-1]  ; значений восьми соседних ячеек,
    add al,byte ptr [di+319]    ; при этом в младших четырёх
    add al,byte ptr [di-319]    ; битах накапливается число
    add al,byte ptr [di+320]    ; соседей.
    add al,byte ptr [di-320]
    add al,byte ptr [di+321]
    add al,byte ptr [di-321]
    shl al,4            ; Теперь старшие четыре бита AL - число
                    ; соседей текущей ячейки.
    or  byte ptr [di],al    ; Поместить их в старшие четыре бита
                    ; текущей ячейки.
    dec di          ; Следующая ячейка.
    jnz step_1          ; Продолжить цикл, если DI не стал равен нулю.
 
; Шаг 2: изменение состояния ячеек в соответствии с полученными в шаге 1
; значениями числа соседей.
 
    mov di,320*200+1        ; Максимальный номер ячейки.
flip_cycle:
    mov al,byte ptr [di]        ; Считать ячейку из массива.
    shr al,4            ; AL - число соседей.
    cmp al,3            ; Если число соседей = 3,
    je  birth           ; ячейка заселяется.
    cmp al,2            ; Если число соседей = 2,
    je  f_C_continue        ; ячейка не изменяется.
    mov byte ptr [di],0     ; Иначе ячейка погибает.
    jmp short f_c_continue
birth:
    mov byte ptr [di],1
f_c_continue:
    and byte ptr [di],0Fh   ; Обнулить число соседей в старших
                    ; битах ячейки.
    dec di          ; Следующая ячейка.
    jnz flip_cycle
 
 
; Вывод массива на экран средствами BIOS.
 
    push    0A000h          ; Сегментный адрес видеопамяти
    pop es          ; в ES.
    mov cx,320*200      ; Максимальный номер точки
    mov di,cx           ; в видеопамяти - 320х200,
    mov si,cx           ; а в массиве - 
    inc si          ; 320*200+1.
    rep movsb           ; Выполнить копирование в видеопамять.
    mov ah,1            ; Если не нажата клавиша - 
    int 16h
    jz  new_cycle       ; следующий шаг жизни.
 
    mov ax,0003h        ; ВОсстановить текстовый режим
    int 10h
    mov ax,4C00h        ; и завершить программу.
    int 21h
 
    .fardata?           ; Сегмент дальних неинициализированных данных
        db  320*200+1 dup(?) ; содержит массив ячеек.
    end start
На выходе получаю таки файл lifedir.exe, НО:

при запуске lifedir.exe появляется ошибка:

C:\Windows\System32\cmd.exe - lifedir.exe
This system does not support fullscrenn mode. Choose 'Close' to terminate the application.
0
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
30.08.2012, 16:08 4
стоит попробовать запустить этот файл через DosBox или какой-либо другой эмулятор (VirtualBox, Bochs, QEMU, ...)
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16347 / 7664 / 1077
Регистрация: 11.11.2010
Сообщений: 13,720
31.08.2012, 04:19 5
Цитата Сообщение от Tot Посмотреть сообщение
winurl.obj : error LNK2001: unresolved external symbol __imp__ExitPRoccess@4
а должно быть ExitProcess
строка в асм-файле "option casemap:none" позволяет различать компилятору строчные и прописные буквы -- будь внимательнее!

Программы для DOS собираются строками
для СОМ
ActionScript 3
1
2
%masm_path%\bin\ml /AT /c %filename%.asm
%masm_path%\bin\link16 /T %filename%.obj,,,,,
для ЕХЕ
ActionScript 3
1
2
%masm_path%\bin\ml /c %filename%.asm
%masm_path%\bin\link16 %filename%.obj,,,,,
0
31.08.2012, 04:19
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.08.2012, 04:19
Помогаю со студенческими работами здесь

fatal error LNK1104
1>LINK : fatal error LNK1104: не удается открыть файл "glut32.lib" Выдает вот такую ошибку. Код такой #include...

Ошибка компоновки fatal error LNK1104: не удается открыть файл "kernel32.lib"
Скажыте пожалуста что делать, оооочень нужно.... у меня выдает ошыбку: 1>LINK : fatal error LNK1104: не удается открыть файл...

Ошибка компиляции: fatal error LNK1104: не удается открыть файл "xxx.exe". VS2010
Всем привет, такая проблема появилась. При частой компиляции в приложении Visual Studio 2010, иногда случается так, что выдается ошибка...

Не работает SFML, выдаёт fatal error LNK1104
У меня Visual Studio 2008. Установила C++ 2008. Теперь пытаюсь запустить программу с библиотекой SFML, так как у меня старая Visual Studio...

Fatal error LNK1104. Удаленный, межпроцессорный com объект
Пытаюсь собрать makefile из урока Дейла Роджерсона. Вылезает ошибка LINK : fatal error LNK1104 cannot open file 'libcimtd.lib'. На форумах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Отключение отслеживания файла, занесенного в .gitignore в Git
hw_wired 10.02.2025
Git помогает следить за изменениями в проекте, но иногда требуется исключить определенные файлы из системы контроля версий. Это могут быть конфигурационные файлы с локальными настройками, временные. . .
Что такое use strict в JavaScript
hw_wired 10.02.2025
Директива use strict - способ перевода JavaScript-кода в строгий режим работы, который делает язык более безопасным и предсказуемым. Она появилась в ECMAScript 5 как ответ на многочисленные проблемы,. . .
Как в jQuery проверить, что элемент скрыт
hw_wired 10.02.2025
jQuery предоставляет несколько эффективных способов определить, скрыт элемент или отображается на странице. Самый простой метод использует специальные селекторы :hidden и :visible. Селектор :hidden. . .
Как проверить (check out) ветку Git в удаленном репозитории
hw_wired 10.02.2025
Проверка удаленной ветки в Git требует понимания нескольких базовых концепций и точного выполнения определенной последовательности действий. Для начала необходимо получить актуальную информацию о. . .
chucknorris в HTML и другие обозначения цветов
hw_wired 10.02.2025
HTML, как основной язык разметки веб-страниц, прошел длинный путь развития в плане работы с цветами. На заре развития веб-технологий разработчики могли использовать только базовый набор из 16. . .
Стек и куча: отличия и назначение
hw_wired 10.02.2025
Управление памятью - ключевой элемент работы любой программы. В современных языках программирования память делится на две основные области: стек и кучу. Каждая из них обладает уникальными. . .
Комментарии в JSON
hw_wired 10.02.2025
JSON - текстовый формат обмена данными, построенный на основе синтаксиса JavaScript. Этот формат отличается простотой, читаемостью и широкой поддержкой во всех современных языках программирования. . . .
Перезаписываем локальные файлы с помощью git pull
hw_wired 10.02.2025
Git pull - незаменимая команда для синхронизации локального репозитория с удаленным. При работе над проектом в команде разработчиков часто возникает необходимость получить актуальные изменения,. . .
Оператор --> в C++
hw_wired 10.02.2025
Оператор --> (называемый "spaceship operator" или оператор космического корабля) - важное нововведение в стандарте C++20, упрощающее реализацию операций сравнения в пользовательских типах данных. . . .
Отмена git add до коммита
hw_wired 10.02.2025
Git предлагает несколько методов для отмены индексации файлов перед созданием коммита. Разработчики часто сталкиваются с ситуацией, когда нужно убрать файлы из индекса, не теряя внесенные изменения в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru