![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
Здравствуйте, задали на лабаре сделать любую программу, которая использует функции написанные на других языках. Используя только метод подключения объектных файлов. Я слышал про такое, но никогда не интересовался, как это делается. Зашли в гугл на паре, полистали странички, нашли пару примеров, один из которых делает именно то что надо. Из Борланда С++, вызывает функцию на Делфи написанную.
Но что мы не писали и как не старались оно так и не заработало. Сперва ели додумались как в Делфи генерировать объектный файл, а поскольку там в опциях 2 радио кнопки, С и С++ файлы перепробовали с обоими. Тоже ничего. А С++ компилятор после добавления того объектного файла постоянно выдавал ошибку
В общем умного ничего не придумали, подскажите, как это нужно делать или может, где-то есть статья или еще что. Спасибо. |
|||
|
||||
| PhoSor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2010 Репутация: нет Всего: нет |
Под каким компилятором исполняемый файл собирать самому догадаться надо?
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
TGrey,
убедитесь что создаваемый .obj имеет формат COFF (настройки компилятора), попробуйте линковать через командную строку (link.exe) Добавлено через 1 минуту и 41 секунду PhoSor, собирает линкер, а не компилятор. Линкер универсальный для всех компиляторов, если у obj, которые создает компилятор, стандартый формат. |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
Да я уже получил консультацию по этому вопросу) Дело в том, что тот пример, что описан вышел собирался в Борландовских Делфях и в Борл. С++. И именно там была та ошибка.
Когда я попробовал из Делфи в Студию перенести, то я получил сообщение, что не может преобразовать формат, как раз COFF. В общем дело все свелось к тому, что у меня кроме МАСМа нет больше никаких Майкрософтовых компиляторов, а если уже и на то пошло, то другие языки программирования тоже не ахти знаю, как там это все реализовано. Попросил людей на МАСМе накатать пару легких функций, но все ушли в подполье( А всего-то нужно пару строк, потому, что работа полностью не состоит из этой темы, а просто затрагивает ее. Вот и нужно любая функция на другом языке, чтобы ее подключить к Студии. Может можете тут помочь? Язык любой, компилятор Майкрософта. Спасибо. |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
TGrey, ну вот вам COFF на фасме
(см. аттач) Присоединённый файл ( Кол-во скачиваний: 5 )
MSCOFF.OBJ 0,27 Kb |
|||
|
||||
| TGrey |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
Эммм, а как вызывать то функцию? Я так понимаю, что она выводил МеседжБокс, но параметры?
Попробовал ничего не вызывает.
|
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
TGrey, там экспортируется "_demo"
extern "C" void _demo(void); или extern "C" void __stdcall demo(void); |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
Что-то все равно не очень
|
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
значит я неугадал, и там не __stdcall
вообще логично, раз @xx нет, значит не __stdcall значит __cdecl extern "C" void __cdecl _demo(void); или extern "C" void __cdecl demo(void); (не помню как манглинг __cdecl выглядит) |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
О есть
А случайно нет ли еще может одной функции какой-то? Еще хотел спросить ФАСМ, это майкросовтовский? Или как его объектный файл подходит? |
|||
|
||||
| Abyx |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
TGrey, фасм не майкрософтовский, просто он умеет генерить MS COFF
flatassembler.net т.к. demo - __cdecl, то ей можно задать любую __cdecl сигнатуру, и она всеравно будет работать например
надо менять ей имя - скачайте фасм и меняйте ей имя пока не надоест. вот вам минимальный шаблон с 3я функциями
Это сообщение отредактировал(а) Abyx - 11.5.2010, 21:55 Присоединённый файл ( Кол-во скачиваний: 3 )
unifunc.OBJ 0,13 Kb |
||||
|
|||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
для __stdcall надо их назвать
func@xx где xx - 4*число агрументов и вместо ret написать ret xx
Это сообщение отредактировал(а) Abyx - 11.5.2010, 21:55 |
|||
|
||||
| TGrey |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 1.12.2007 Репутация: нет Всего: 1 |
Дело в том, что я не знаю АСМ) Собираюсь начать изучать, но руки никак не доходят.
Я понимаю, что шаблон есть, но я то не знаю через какие регистры передавать параметры и как это правильно делать) Кстати, я вроде читал что там вроде 4*кол-во должно быть. sizeof(type)*кол-во? В общем я так и сижу вникаю с чего начинать, ТАСМ, ФАСМ, МАСМ, везде синтаксис разный 0_о тут хоть бы основы выучить, а что дальше выбрать |
|||
|
||||
| Abyx |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 аргумента, но это редкие случаи. |
|||
|
||||
| PhoSor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2010 Репутация: нет Всего: нет |
Виноват, забыл что gcc юзаю. Там и компилятор и линкер в через один исполняемый работают.
И еще я птму и спрашивал про компилятор, чтобы узнать какой формат на выходе у объектного файла будет. Птму как некоторые кроссплатформенные компиляторы без пинка могут код записать в файлик с ELF оберткой. Ну и про линкеры, я думаю, имелась ввиду универсальность не компиляторов, а форматов объектных файлов. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |