Форум программистов, компьютерный форум 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
murderer
Форумчанин
3099 / 1323 / 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
Форумчанин
3099 / 1323 / 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Ответов Автор Дата
Assembler Есть ли во введенной строке символов символ точка. Если есть, выводится символ «Ok» или «Not»
Построить и отладить программу на Ассемблере, которая: Определяет, есть ли во введенной строке символов символ точка. Если есть, выводится символ «Ok» или «Not» Заранее благодарен.
Assembler, MASM, TASM 9 Di22rus 11.06.2014 14:43
Assembler Есть программа. Нужно ввести слово и вывести первый символ, всю строку и последний символ вот часть кода
mov ah,02h mov dl,10 int 21h mov ah,02h mov dl,13 int 21h mov AH,09h ; vivod sms lea dx,msg
Assembler, MASM, TASM 1 foration7 21.12.2013 15:47
Assembler Макроопределения совместно с с++: Заменить заданный символ в строке текста на указанный новый символ
Вот код. Задание: заменить заданный символ в строке текста на указанный новый символ. Выдает следующую ошибку на строку "find_space_index string1, string2" 1>macro.asm(110): error A2022: instruction...
Assembler для начинающих 4 Дев4енка 20.11.2013 02:12
Assembler Компоновка функции на ассемблере с Турбо Си (функции не определены)
Я выполняю компоновку своих функций на ассемблере с Турбо Си. Почему компоновщик сообщает, что все мои функции не оп- ределены? компилятор borland c++ и tasm вот код#include <stdio.h> extern int...
Assembler, MASM, TASM 7 Seroo 23.09.2012 19:06
Assembler Заменить в строке встречающийся символ "a" на символ "k".
Ввести строку символьных данных, задавая буфер равный 40 байт. Заменить в этой строке встречающийся символ "a" на символ "k". Выдать полученную строку символов в первую строку экрана, начиная с 12...
Assembler, MASM, TASM 8 Slip38 26.11.2011 17:44
Assembler записать символ в буфер клавиатуры, потом проверить буфер на наличие в нём символов, и вывести данный символ
Доброго дня всем. Прошу помочь немного с несложной задачей, на использование прерывания INT 16h. Суть следущая: надо записать символ в буфер клавиатуры, потом проверить буфер на наличие в нём...
Assembler, MASM, TASM 1 ACullenLover 04.10.2010 15:24
Assembler Символ
Здравствуйте уважаемые. Подскажите пожалуйста, что неправильно в коде? Тоесть должно показывать перемещающийся символ. Он показывается, но как-бы моментами (то идёт ряд символов, то нет вообще)...
Assembler, MASM, TASM 8 assemb 01.10.2010 08:16
Assembler Компиляция и компоновка
Можете рассказать, как компилировать и компоновать в MASM и TASM.:help:
Assembler: DOS/Real Mode/16-bits 2 Alexandr 30.10.2008 16:11
Опции темы

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