Форум программистов, компьютерный форум CyberForum.ru
CyberForum.ru - форум программистов и сисадминов > > >
Восстановить пароль Регистрация
 
Maksim_27_10
Новичок
1 / 1 / 0
Регистрация: 05.11.2009
Сообщений: 23
15.01.2011, 10:27     Правильная компоновка(символ подчёркивания).   #1
Существует набор файлов *.obj и один *.inc. Используются функции Win API. При компоновке возникают ошибки:

InitPool.obj : error LNK2001: unresolved external symbol _VirtualAllocEx
Destroy.obj : error LNK2001: unresolved external symbol _VirtualFreeEx
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
SGV.exe : fatal error LNK1120: 3 unresolved externals

Прототипы написаны так:
VirtualAllocEx PROTO NEAR C,
pvAddress : LPVOID,
dwSize : SIZE_T,
fdwAllocationType : DWORD,
fdwProtecf : DWORD

VirtualFreeEx PROTO NEAR C,
pvAddress : LPVOID,
dwSize : SIZE_T,
fdwFreeType : DWORD

Как переписать прототипы функций, чтобы работало? Пробовал алиасы, но что-то даже не компилирует с ними, тем более INVOKE требует прототип. Есть способ обойти ограничение компоновщика?
Включение всего в один файл не предлогать!

Заранее благодарен.
AdAgent
Объявления
15.01.2011, 10:27    Правильная компоновка(символ подчёркивания).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2011, 10:27    Правильная компоновка(символ подчёркивания).

Посмотрите здесь:

Assembler Компиляция и компоновка

Assembler Неверный символ

Assembler Символ

Assembler записать символ в буфер клавиатуры, потом проверить буфер на наличие в нём символов, и вывести данный символ

Assembler Заменить в строке встречающийся символ "a" на символ "k".

Assembler Компоновка функции на ассемблере с Турбо Си (функции не определены)

Assembler Символ клавиатуры

Assembler Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ

Assembler Есть программа. Нужно ввести слово и вывести первый символ, всю строку и последний символ вот часть кода

Assembler Есть ли во введенной строке символов символ точка. Если есть, выводится символ «Ok» или «Not»

murderer
Форумчанин
3100 / 1324 / 43
Регистрация: 06.10.2010
Сообщений: 2,841
15.01.2011, 10:29     Правильная компоновка(символ подчёркивания).   #2
может вместо "NEAR C" надо "NEAR STDCALL"?
Maksim_27_10
Новичок
1 / 1 / 0
Регистрация: 05.11.2009
Сообщений: 23
15.01.2011, 18:45  [ТС]     Правильная компоновка(символ подчёркивания).   #3
Я сделал так(теперь только одна ошибка):
ASA.inc
EXTERNDEF _imp__VirtualAlloc@16 : PTR pr4
EXTERNDEF _imp__VirtualFree@12 : PTR pr3

VirtualAlloc EQU <_imp__VirtualAlloc@16>
VirtualFree EQU <_imp__VirtualFree@12>

Всё ошибки компоновки связанные с этими функциями исчесли, а NEAR C -> NEAR STDCALL даёт тот же результат.
--------------------------------------------------------------------------------------------------------

Меня смущает только одно(в сети пишут):
externdef imp__WriteFile@20:PTR pr5
WriteFile equ <_imp__WriteFile@20>

Также обратите внимание на символы прочерка. В первой строке "imp__func@XX" пишется вообще без знаков прочерка, во второй - с одним прочерком. Любые другие варианты не работают.
--------------------------------------------------------------------------------------------------------
Почему так? Ну, да, ладно. Компилирует и компонует - это хорошо.

Подскажите пожалуйста что делать с последней ошибкой компоновки(надеюсь):
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
SGV.exe : fatal error LNK1120: 1 unresolved externals

Как её устранить(пробовал выполнять подстановку NEAR C -> NEAR STDCALL !)?
--------------------------------------------------------------------------------------------------------

Код:
.CODE
main PROC NEAR C

; <код>

INVOKE ExitProcess, 0
main ENDP
END main

Добавлено через 2 часа 58 минут
Я понял что нужно компоновщику - библиотека времени выполнения C.

Необходимо сделать так:
.CODE
start:
; Инициализация библиотеки.

call Main
INVOKE ExitProcess, 0

Main PROC NEAR C
; <code>
Main ENDP

END start
;-------------------------------------------------------------------------------------------------------

В сети советуют подать компоновщику на вход msvcrt.lib, но я его подавал - не находит _mainCRTStartup. Искал сам в этой библиотеки COFF указанную функцию - не нашёл.
Итак, два вопроса:
1) Как называется библиотека C(я использую MASM)?
2) Как я должен инициализировать эту библиотеку(лучше отошлите на какой-нибудь ресурс или дайте дельный совет по инициализации библиотеки)?

Добавлено через 9 минут
*MASM32.
murderer
Форумчанин
3100 / 1324 / 43
Регистрация: 06.10.2010
Сообщений: 2,841
15.01.2011, 18:47     Правильная компоновка(символ подчёркивания).   #4
Лучше избавься от этой _mainCRTStartup.

http://www.rsdn.ru/article/cpp/crt.xml
Maksim_27_10
Новичок
1 / 1 / 0
Регистрация: 05.11.2009
Сообщений: 23
16.01.2011, 22:10  [ТС]     Правильная компоновка(символ подчёркивания).   #5
Я не решил эту проблему. Я думаю, что это из-за директивы .MODEL flat, C повсеместно, но эта директива должна быть, так как это всё пойдёт после тестирования в *.lib.
Может посоветуете что-то другое, не MASM32, только программы должны выполняться под Vista и в консоли.
Yandex
Объявления
16.01.2011, 22:10    Правильная компоновка(символ подчёркивания).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +4.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.