Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключение obj файла 
:(
    Опции темы
TGrey
Дата 6.5.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте, задали на лабаре сделать любую программу, которая использует функции написанные на других языках. Используя только метод подключения объектных файлов. Я слышал про такое, но никогда не интересовался, как это делается. Зашли в гугл на паре, полистали странички, нашли пару примеров, один из которых делает именно то что надо. Из Борланда С++, вызывает функцию на Делфи написанную.
Но что мы не писали и как не старались оно так и не заработало.
Сперва ели додумались как в Делфи генерировать объектный файл, а поскольку там в опциях 2 радио кнопки, С и С++ файлы перепробовали с обоими. Тоже ничего. А С++ компилятор после добавления того объектного файла постоянно выдавал ошибку 
Цитата

Fail. Access violation. Terminating

В общем умного ничего не придумали, подскажите, как это нужно делать или может, где-то есть статья или еще что.
Спасибо.
PM MAIL   Вверх
PhoSor
Дата 11.5.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Под каким компилятором исполняемый файл собирать самому догадаться надо?
PM MAIL   Вверх
GoldFinch
Дата 11.5.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



TGrey, 
убедитесь что создаваемый .obj имеет формат COFF (настройки компилятора),
попробуйте линковать через командную строку (link.exe)

Добавлено через 1 минуту и 41 секунду
PhoSor, собирает линкер, а не компилятор. Линкер универсальный для всех компиляторов, если у obj, которые создает компилятор, стандартый формат.
PM MAIL ICQ   Вверх
TGrey
Дата 11.5.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да я уже получил консультацию по этому вопросу) Дело в том, что тот пример, что описан вышел собирался в Борландовских Делфях и в Борл. С++. И именно там была та ошибка.
Когда я попробовал из Делфи в Студию перенести, то я получил сообщение, что не может преобразовать формат, как раз COFF.
В общем дело все свелось к тому, что у меня кроме МАСМа нет больше никаких Майкрософтовых компиляторов, а если уже и на то пошло, то другие языки программирования тоже не ахти знаю, как там это все реализовано.
Попросил людей на МАСМе накатать пару легких функций, но все ушли в подполье( А всего-то нужно пару строк, потому, что работа полностью не состоит из этой темы, а просто затрагивает ее. Вот и нужно любая функция на другом языке, чтобы ее подключить к Студии.
Может можете тут помочь? Язык любой, компилятор Майкрософта.
Спасибо.
PM MAIL   Вверх
Abyx
Дата 11.5.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TGrey, ну вот вам COFF на фасме
Код


; example of making Win32 COFF object file

format MS COFF

extrn '__imp__MessageBoxA@16' as MessageBox:dword

section '.text' code readable executable

 public _demo

 _demo:
    push    0
    push    _caption
    push    _message
    push    0
    call    [MessageBox]
    ret

section '.data' data readable writeable

 _caption db 'Win32 assembly',0
 _message db 'Coffee time!',0

(см. аттач)

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  MSCOFF.OBJ 0,27 Kb
PM MAIL   Вверх
TGrey
Дата 11.5.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Эммм, а как вызывать то функцию? Я так понимаю, что она выводил МеседжБокс, но параметры?
Код

//extern "C" int _stdcall Mes(HWND, LPCSTR, LPCSTR, UINT);

Попробовал ничего не вызывает.
Цитата

Linking...
1.obj : error LNK2001: unresolved external symbol _Mes@16
Debug/diit6.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

PM MAIL   Вверх
Abyx
Дата 11.5.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TGrey, там экспортируется "_demo"

extern "C" void _demo(void); 
или
extern "C" void __stdcall demo(void);
PM MAIL   Вверх
TGrey
Дата 11.5.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то все равно не очень
Код

Linking...
1.obj : error LNK2001: unresolved external symbol _demo@0
Debug/diit6.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

PM MAIL   Вверх
Abyx
Дата 11.5.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



значит я неугадал, и там не __stdcall
вообще логично, раз @xx нет, значит не __stdcall
значит __cdecl
extern "C" void __cdecl _demo(void); 
или
extern "C" void __cdecl demo(void); 

(не помню как манглинг __cdecl выглядит)
PM MAIL   Вверх
TGrey
Дата 11.5.2010, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



О есть
Код

extern "C" void _cdecl demo(void); 

int main()
{
    demo();
    return 0;
}


А случайно нет ли еще может одной функции какой-то? smile 


Еще хотел спросить ФАСМ, это майкросовтовский? Или как его объектный файл подходит?
PM MAIL   Вверх
Abyx
Дата 11.5.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TGrey, фасм не майкрософтовский, просто он умеет генерить MS COFF
flatassembler.net

т.к. demo - __cdecl, то ей можно задать любую __cdecl сигнатуру, и она всеравно будет работать

например
Код

extern "C" Foo* __cdecl demo(int&, float, char*);


надо менять ей имя -  скачайте фасм и меняйте ей имя пока не надоест.

вот вам минимальный шаблон с 3я функциями
Код

format MS COFF

section '.text' code readable executable

 public _func1
 public _func2
 public _func3

 _func1:
 _func2:
 _func3:
        ret


Это сообщение отредактировал(а) Abyx - 11.5.2010, 21:55

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  unifunc.OBJ 0,13 Kb
PM MAIL   Вверх
Abyx
Дата 11.5.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



для __stdcall надо их назвать 
func@xx
где xx - 4*число агрументов
и вместо ret написать ret xx
Код

public stdcall_3arg_func@12 ; 12 = 3*4
stdcall_3arg_func@12:
ret 12


Это сообщение отредактировал(а) Abyx - 11.5.2010, 21:55
PM MAIL   Вверх
TGrey
Дата 11.5.2010, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дело в том, что я не знаю АСМ) Собираюсь начать изучать, но руки никак не доходят.
Я понимаю, что шаблон есть, но я то не знаю через какие регистры передавать параметры и как это правильно делать)

Кстати, я вроде читал что там вроде 4*кол-во должно быть. sizeof(type)*кол-во?

В общем я так и сижу вникаю с чего начинать, ТАСМ, ФАСМ, МАСМ, везде синтаксис разный 0_о тут хоть бы основы выучить, а что дальше выбрать smile 
PM MAIL   Вверх
Abyx
Дата 11.5.2010, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TGrey, если вам не надо писать код функции - то вам не надо знать асм

4*количество_аргументов
0 аргументов, func(void) - func@0
1 аргумент, func(T1 arg1) - func@4
2 аргумента, func(T1 arg1, T2 arg2) - func@8
....

под "аргументом" понимается тип размером не больше dword.
типы большей длины считаются за несколько аргментов, например double - 8 байт, как 2 аргумента,
но это редкие случаи.
PM MAIL   Вверх
PhoSor
Дата 12.5.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Виноват, забыл что gcc юзаю. Там и компилятор и линкер в через один исполняемый работают.
И еще я птму и спрашивал про компилятор, чтобы узнать какой формат на выходе у объектного файла будет. Птму как некоторые кроссплатформенные компиляторы без пинка могут код записать в файлик с ELF оберткой.
Ну и про линкеры, я думаю, имелась ввиду универсальность не компиляторов, а форматов объектных файлов.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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