Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 08:37
Оценка:


[/cpp]
Всем доброго времени суток!
Подскажите, в каких библиотеках расположены функции, такие как printf/getch и т.п. Мне необходимо, так уж случилось, вызвывать из программы на ассемблере данные
функции C++. Передача параметров и т.п мне не нужно. Вопрос: каким образом и из каких lib или obj в С++ линкуются данные функции...

24.09.07 04:34: Перенесено модератором из 'C/C++' — Павел Кузнецов
__c0d0__
Re: Линковка программы в VS 6/7/8
От: Sergey Chadov Россия  
Дата: 23.09.07 10:40
Оценка:
Здравствуйте, __c0d0__, Вы писали:

___>

___>

___>

___>[/cpp]
___>Всем доброго времени суток!
___>Подскажите, в каких библиотеках расположены функции, такие как printf/getch и т.п. Мне необходимо, так уж случилось, вызвывать из программы на ассемблере данные
___>функции C++. Передача параметров и т.п мне не нужно. Вопрос: каким образом и из каких lib или obj в С++ линкуются данные функции...

libcmt.lib — Multithreaded, static link
msvcrt.lib — Multithreaded, dynamic link (import library for MSVCR80.DLL)
libcmtd.lib — Multithreaded, static link (debug)
msvcrtd.lib — Multithreaded, dynamic link (debug) (import library for MSVCR80D.DLL)
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 10:50
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, __c0d0__, Вы писали:


___>>Подскажите, в каких библиотеках расположены функции, такие как printf/getch и т.п. Мне необходимо, так уж случилось, вызвывать из программы на ассемблере данные

___>>функции C++. Передача параметров и т.п мне не нужно. Вопрос: каким образом и из каких lib или obj в С++ линкуются данные функции...

SC>libcmt.lib — Multithreaded, static link

SC>msvcrt.lib — Multithreaded, dynamic link (import library for MSVCR80.DLL)
SC>libcmtd.lib — Multithreaded, static link (debug)
SC>msvcrtd.lib — Multithreaded, dynamic link (debug) (import library for MSVCR80D.DLL)

Sergey, я просматривал msvcrt.lib там действительно есть функция printf, ОДНАКО при вызове этой функции (printf)
путем статической линковки msvcrt.lib и динамической линковки MSVCR80.DLL, в обоих случаях появляется диалог:

Runtime error!
R6034
An application has an attempt to load the C runtime library incorrectly,
Lpease contact the application's support team for more information.

Вопрос: как корректно вызвать (хотя бы printf) из программы на ассемблере (masm32)???

Спасибо Sergey за участие!
__c0d0__
Re[3]: Линковка программы в VS 6/7/8
От: Sergey Chadov Россия  
Дата: 23.09.07 11:27
Оценка:
Здравствуйте, __c0d0__, Вы писали:

___>Вопрос: как корректно вызвать (хотя бы printf) из программы на ассемблере (masm32)???


Re: Не получается вызвать sprintf
Автор: vvotan
Дата: 07.12.05


с printf дело немного сложнее, потому как нужно инициализировать stdout и наверное еще что-нибудь.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[4]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 11:40
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:


SC>с printf дело немного сложнее, потому как нужно инициализировать stdout и наверное еще что-нибудь.


Спасибо Sergey, направление понял буду ковырять. мне было важно убедиться, из какой библиотеки эти
функции C++ цепляет.

Получится, выкладу сегодня (попозже)...
__c0d0__
Re[3]: Линковка программы в VS 6/7/8
От: Tonal- Россия www.promsoft.ru
Дата: 23.09.07 12:05
Оценка:
Здравствуйте, __c0d0__, Вы писали:
___>Sergey, я просматривал msvcrt.lib там действительно есть функция printf, ОДНАКО при вызове этой функции (printf)
___>путем статической линковки msvcrt.lib и динамической линковки MSVCR80.DLL, в обоих случаях появляется диалог:
___>    Runtime error!
___>    R6034
___>    An application has an attempt to load the C runtime library incorrectly,
___>    Lpease contact the application's support team for more information.

___>Вопрос: как корректно вызвать (хотя бы printf) из программы на ассемблере (masm32)???
Посмотреть как корректно инициализировать crt можно в исходниках идущих с MS VC.
Так же этот код есть и mingw/cygwin
... << RSDN@Home 1.2.0 alpha rev. 760>>
Re[4]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 12:51
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, __c0d0__, Вы писали:

___>>Sergey, я просматривал msvcrt.lib там действительно есть функция printf, ОДНАКО при вызове этой функции (printf)
___>>путем статической линковки msvcrt.lib и динамической линковки MSVCR80.DLL, в обоих случаях появляется диалог:
T>
___>>    Runtime error!
___>>    R6034
___>>    An application has an attempt to load the C runtime library incorrectly,
___>>    Lpease contact the application's support team for more information.
T>

___>>Вопрос: как корректно вызвать (хотя бы printf) из программы на ассемблере (masm32)???
T>Посмотреть как корректно инициализировать crt можно в исходниках идущих с MS VC.


Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...
Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...

Спасибо за подсказку про инициализацию crt, буду пробовать, там по моему и функция попроще
есть, которая вызвается из printf() с параметром stdout...
__c0d0__
Re: Линковка программы в VS 6/7/8
От: bnk СССР http://unmanagedvisio.com/
Дата: 23.09.07 13:05
Оценка:
Здравствуйте, __c0d0__, Вы писали:

>Подскажите, в каких библиотеках расположены функции, такие как printf/getch и т.п. Мне необходимо, так уж случилось, вызвывать из программы на ассемблере данные функции C++. Передача параметров и т.п мне не нужно. Вопрос: каким образом и из каких lib или obj в С++ линкуются данные функции...


А зачем вам функции C ран-тайма??
С рантайм он на то и С рантайм чтобы использовать его из языка С.

Может вам разумнее посмотреть на Win32 API (если все это под Windows, masm32 вроде это подразумевает)
Я имею в виду, типа, WriteConsole, ReadConsole?
Re[2]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 14:18
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Может вам разумнее посмотреть на Win32 API (если все это под Windows, masm32 вроде это подразумевает)

bnk>Я имею в виду, типа, WriteConsole, ReadConsole?

Спасибо, bnk, я их прекрасно знаю, однако printf() приведен для примера... Хотя даже printf()
довольно сложная функция с форматированием выводимого на консоль текста. А бывают ситуации,
когда требуется срочно в программу на асм'е вставить кусок который уже реализован на С. У
меня это бывало часто (и бывает, т.к. masm32 -- мой основной язык, и учился я именно на нем
программированию), и каждый раз приходилось реализовать эти куски кода ручками, хотя в
Линухе например проблем вообще никаких с этим не возникает... (Slackware 11).
Сам я в основном на Wind'e (работа).

Так что вопрос это ОБЩЕГО ХАРАКТЕРА, как конкретно слинковать основную программу на
ассемблере и функции из библиотек на С/C++ (от Microsoft VC).

Спасибо всем кто принимает участие в этой беседе

Может добьем все-таки до конца? До практического примера?

Sergey! Ваш пример у меня не пошел... Та же ошибка!
__c0d0__
Re[5]: Линковка программы в VS 6/7/8
От: Sergey Chadov Россия  
Дата: 23.09.07 14:22
Оценка:
Здравствуйте, __c0d0__, Вы писали:

___>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
Я буду возражать!
Мой пример никаких диалогов не выдает.
Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[6]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 14:31
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, __c0d0__, Вы писали:


___>>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
SC>Я буду возражать!
SC>Мой пример никаких диалогов не выдает.
SC>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)

Sergey я и не сомневался что Вы говорите чистую правду и У ВАС пример работает. Я использовал в коде

includeolib msvcrt.lib

все остальное делал link.exe. Программка откопилилась, а результат Вы знаете...

Возможно это связано с версией VC (8)
__c0d0__
Re[6]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 14:32
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, __c0d0__, Вы писали:


___>>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
SC>Я буду возражать!
SC>Мой пример никаких диалогов не выдает.
SC>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)


Извините, не туда что ли влепил...

___>>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
SC>Я буду возражать!
SC>Мой пример никаких диалогов не выдает.
SC>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)

Sergey я и не сомневался что Вы говорите чистую правду и У ВАС пример работает. Я использовал в коде

includeolib msvcrt.lib

все остальное делал link.exe. Программка откопилилась, а результат Вы знаете...

Возможно это связано с версией VC (8)
__c0d0__
Re[6]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 14:53
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, __c0d0__, Вы писали:


___>>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
SC>Я буду возражать!
SC>Мой пример никаких диалогов не выдает.
SC>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)


Да действительно при использовании msvcrt.lib из пакета VC7 и msvcrt.dll все работает

В чём же тогда загадка с пакетом VC8
__c0d0__
Re[6]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 15:21
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:


SC>Я буду возражать!

SC>Мой пример никаких диалогов не выдает.
SC>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)


Используя msvcrt.dll и msvcrt.lib из VC7 работает даже printf!!!


.386
.model flat

includelib \lib\kernel32.lib
includelib msvcrt.lib

extrn __imp__GetStdHandle@4:dword
extrn __imp__WriteConsoleA@20:dword
extrn __imp__ExitProcess@4:dword
extrn __imp__printf:dword

STD_OUTPUT_HANDLE equ -11

.data
br dd ?
fstr db 'Test: %d %d',0

.code
_start:
push 10
push 20
push offset fstr
call __imp__printf
add esp, 12

push 0
call __imp__ExitProcess@4
end _start


Такой код прекрасно работает

Теперь другой вопрос:

1/ Почему это не получается с msvcrt80.dll
2/ Есть ли в Windows по умолчанию msvcrt.dll (7) или она устанавливается только с VS?
у кого нет Visual Studio посмотрите! пожайлуста...
3/ КАК СЛИНКОВАТЬ ТАК, ЧТОБЫ КОД РАБОТАЛ БЕЗ ЭТОЙ DLL? Возможно ли это?
__c0d0__
Re[7]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 15:23
Оценка:
Здравствуйте, __c0d0__, Вы писали:

___>Здравствуйте, Sergey Chadov, Вы писали:


SC>>Здравствуйте, __c0d0__, Вы писали:


___>>>Буду пробовать, так как пример приведенный Sergey'ем выдает тот же саиый диалог с ошибкой...

___>>>Неужели, чтобы вызвать простую функцию! надо столько заморачиваться...
SC>>Я буду возражать!
SC>>Мой пример никаких диалогов не выдает.
SC>>Тут дело в том, что я использовал(и тебе того же советую) msvcrt.dll, а не msvcr80.dll(которой тогда еще не было)

___>Sergey я и не сомневался что Вы говорите чистую правду и У ВАС пример работает. Я использовал в коде


___> includeolib msvcrt.lib


___>все остальное делал link.exe. Программка откопилилась, а результат Вы знаете...


___>Возможно это связано с версией VC (8)



Извините, не пойму куда мои сообщения попадают (это проверка)
__c0d0__
Re[7]: Линковка программы в VS 6/7/8
От: Sergey Chadov Россия  
Дата: 23.09.07 15:35
Оценка:
___>Теперь другой вопрос:

___> 1/ Почему это не получается с msvcrt80.dll

По всей видимости майкрософт написал туда какую-то бяку

___> 2/ Есть ли в Windows по умолчанию msvcrt.dll (7) или она устанавливается только с VS?

В XP и старше точно есть, в 2000 не уверен, но по-моему тоже. В 9x точно нет, ну да и лесом их.

___> 3/ КАК СЛИНКОВАТЬ ТАК, ЧТОБЫ КОД РАБОТАЛ БЕЗ ЭТОЙ DLL? Возможно ли это?

найти старый статический рантайм, например libcmt от VS6, хотя я сам не пробовал.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[8]: Линковка программы в VS 6/7/8
От: __c0d0__  
Дата: 23.09.07 15:53
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

___>>Теперь другой вопрос:


___>> 1/ Почему это не получается с msvcrt80.dll

SC>По всей видимости майкрософт написал туда какую-то бяку

___>> 2/ Есть ли в Windows по умолчанию msvcrt.dll (7) или она устанавливается только с VS?

SC>В XP и старше точно есть, в 2000 не уверен, но по-моему тоже. В 9x точно нет, ну да и лесом их.

___>> 3/ КАК СЛИНКОВАТЬ ТАК, ЧТОБЫ КОД РАБОТАЛ БЕЗ ЭТОЙ DLL? Возможно ли это?

SC>найти старый статический рантайм, например libcmt от VS6, хотя я сам не пробовал.


Еще раз благодарю ВСЕХ за участие, особенно Sergey'я...
Механика ясна (Microsoft сво..., людей не любят), а я эту тему закрываю в виду ее исчерпанности...

Всем спасибо!
__c0d0__
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.