Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extern "С" asm функция, unresolved external symbol 
:(
    Опции темы
Programister0
Дата 15.7.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



пытаюсь подключить asm функцию к C проекту
вот функция:
Код

.686
.model flat  ,stdcall
  option casemap:none
  include    c:\masm32\include\windows.inc
  include    c:\masm32\include\user32.inc
  includelib c:\masm32\lib\user32.lib 
  include    c:\masm32\include\kernel32.inc
  includelib c:\masm32\lib\kernel32.lib
.data
  MsgBoxCaption  db "hello",0
  MsgBoxText     db "word!",0
.code
;------------------------------------------------------------------------
  _mess@0 proc   
    invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK ;
    ret 0  
  _mess@0 endp
;------------------------------------------------------------------------
end 


здесь её подключаю:
Код

#include "stdafx.h"
extern "C" void __stdcall mess(); 
int _tmain(int argc, _TCHAR* argv[])
{
    mess();
    return 0;
}

и компилятору это ненравится говорит:
proc_ASM.obj : error LNK2001: unresolved external symbol _mess
C:\visualStudio\prj6_asm\proc_ASM\Release\proc_ASM.exe : fatal error LNK1120: 1 unresolved externals


до этого писал простенькие экзамплы из книжки Юрова
вот например:
Код

.686
.model flat 
  option casemap:none
.data
  res DD 0
.code
;------------------------------------------------------------------------
; extern "C" int __stdcall example1(int i1,int i2);
; вычитание двух чисел
  _example1@8 proc  ;
    push EBP
    mov  EBP, ESP
    finit
    fild  dword ptr [EBP+8]
    fisub dword ptr [EBP+12]
    fistp dword ptr res
    mov  EAX, res
    pop  EBP
    ret  8 
  _example1@8 endp
;------------------------------------------------------------------------
end 

все чудно работало, 
как начал вызывать api-е функции так начались проблемы
language type must be specified и т.д.

последнюю она-же вторая(проблема всмысле) решить немогу
пишу на VS2005
obj - файлы создаю на masm32 

need backup.



PM MAIL WWW ICQ Skype   Вверх
W4FhLF
Дата 15.7.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Цитата(Programister0 @  15.7.2007,  12:03 Найти цитируемый пост)
obj - файлы создаю на masm32 


Создавай lib

В def файл: 

Цитата

LIBRARY Example 
EXPORTS 
mess 


Компилируем так: 

Цитата

set cmpl=C:\masm32 
%cmpl%\bin\ml /nologo /c /coff /Cp /IC:\masm32\include\ dll.asm 
%cmpl%\bin\link -lib dll.obj 
del *.exp 
del *.obj 
pause


Добавлено через 5 минут и 5 секунд
А, ну и подключаем так:

Код

#pragma comment (lib, "Example.lib") 

extern "C" { 
void _stdcall mess(void); 
} 


Это сообщение отредактировал(а) W4FhLF - 15.7.2007, 12:26


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Programister0
Дата 15.7.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



э .. нет 
вот как:
Цитата

if exist example1.obj del example.obj
if exist example1.exe del example.exe
c:\masm32\bin\ml /c /coff /nologo example.asm
c:\masm32\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text example.obj > nul
pause

далее включаю obj файл в проект 
прописываю
Код
extern "C" void __stdcall mess();

и всё!
и до этого момента все просто замечательно работало
(я и сам непонимаю как)
в книге тоже про некоторые моменты умолчали.

зачем эта dll.asm

Добавлено через 3 минуты и 41 секунду
извеняюсь, почемуто два раза вывелось!? 
PM MAIL WWW ICQ Skype   Вверх
W4FhLF
Дата 15.7.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Делай как я показал. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Programister0
Дата 15.7.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



тебя частично понял
вот батник:
Цитата

c:\masm32\bin\ml.exe /nologo /c /coff /Cp /IC:\masm32\include\ example.asm
c:\masm32\bin\Link -lib example.obj

создаётюся obj и lib файлы без errors и warnings,
добавляю их в проект,
далее пишу:
Код

#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

#pragma comment (lib, "example.lib") 

extern "C" { 
void _stdcall mess(void); 
} 

int _tmain(int argc, _TCHAR* argv[])
{
    mess();
    return 0;
}

пытаясь все это откомплирывать получаю :
proc_ASM.obj : error LNK2001: unresolved external symbol _mess@0
c:\visualStudio\prj6_asm\proc_ASM\Release\proc_ASM.exe : fatal error LNK1120: 1 unresolved externals

а ещё я не совсем догнал что делать с def файлом и как и откуда его взять я пробовал 
создавать его и прописывать то что ты советывал - компилятор мне не верит, говорит:
deffile.def : error LNK2001: unresolved external symbol mess
PM MAIL WWW ICQ Skype   Вверх
W4FhLF
Дата 15.7.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



asm:

Код

.686 
.model flat,stdcall 
option casemap:none 


    include windows.inc 
    include kernel32.inc 
    include user32.inc 

    includelib kernel32.lib 
    includelib user32.lib 

    include C:\masm32\macros\Strings.mac 
    
msgbox proto

.data 
    msgtext db "Hello, it's message from lib!",0
    msgcapt db "Caption",0
.data? 

.code
start:

msgbox proc 
    invoke MessageBox, 0, offset msgtext, offset msgcapt, MB_OK+MB_ICONINFORMATION
    ret
msgbox endp 

end start


bat:

Цитата

C:\masm32\bin\ml /nologo /c /coff /Cp /IC:\masm32\include\ dll.asm 
C:\masm32\bin\link -lib dll.obj 
del *.obj 
pause


cpp:

Код

#include <iostream> 

#pragma comment (lib, "dll.lib") 

extern "C" { 
    void _stdcall msgbox(); 
} 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    msgbox(); 
    return 0; 
}


Всё отлично работает. 




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Programister0
Дата 15.7.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



спасибо что все разжевал W4FhLF
теперь я разобрался 
все можно проще сделать 
вот мой батник:
Цитата

del *.obj 
c:\masm32\bin\ml /c /coff /nologo example3.asm
pause

оказалось нужен только obj файл или lib я включал только первый и все заработало 
проблема была в asm коде где по соглашению stdcall
надо писать 
_mess@0 proc ;где 0 - количество байт занимаемых параметрами в стеке   
я так понял по книге Юрова
я ошибался!
в cpp я вставил тоже самое теперь все работает
ещё раз спасибо за помощь.

я смотрел ваш сайт, у вас там ссылка на скачку Training Disassembler не работает.
так на всякий случай сообщаю может не так задумано.
PM MAIL WWW ICQ Skype   Вверх
Programister0
Дата 17.7.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



блин опять засада 
теперь в Builder'e 6-м тоже самое немогу сделать
пробовал разные параметры для ml.exe 
вот что советывал Юров в своей книги для создания OMF 
Цитата

C:\masm32\bin\ml /c /Fo example.obj example.asm 


но билдер неверит - он спокойно отвечает:
[Linker Error] 'C:\BUILDER\EXAMPLE.LIB' contains invalid OMF record, type 0x21 (possibly COFF)  

пробовал через lib 
Цитата

C:\masm32\bin\link -lib example.obj 



Добавлено через 3 минуты и 19 секунд
во время компановки выдает предупреждение:
example.obj : warning LNK4033: converting object format from OMF to COFF

значит это omf 
что билдеру ненравится?
подключаю либ
Код

#pragma comment (lib, "example.lib") 

как вы вообщем и советывали 
реакция таже.
PM MAIL WWW ICQ Skype   Вверх
Programister0
Дата 17.7.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



нашел програмку 
вместе с билдером шла - coff2omf.exe
выполняю следующее:
Цитата

coff2omf.exe example.obj example_omf.obj
или
coff2omf.exe -lib:st example.obj example_omf.obj

нечего неработает!
всмысле example_omf.obj создаются а работать отказываются 
но сообщение уже другие получаются:
[Linker Error] Unresolved external 'mess' referenced from C:\BUILDER\UNIT1.OBJ
PM MAIL WWW ICQ Skype   Вверх
Programister0
Дата 21.7.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 28.5.2007

Репутация: нет
Всего: нет



все разобрался теперь все работает

необходимо было 
1. компоновать без параметра /coff
2. преобразовывать получавшиеся obj файлы програмкой omf2d
и все работает!
 тема закрыта!
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.