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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ANSI C: Импорт внешней функции main, Как импортировать и вызвать main функцию 
V
    Опции темы
Dagger
Дата 19.2.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

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



У меня есть два файла. Как  в первом так и во втором есть функция main.
Допустим 
(1) – foo1.c / foo1.h
(2) – foo2.c / foo2.h

Надо из (1) импортировать main и иметь возможность ее вызвать в (2). 

Как это реализовать?
PM MAIL WWW Skype   Вверх
mes
Дата 19.2.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



тогда в одном файле функция должна быть объявлена с внешним связыванием, а вторая статической,
а чтоб одну использовать в другой, нужно для первой задать другое имя.
вобщем типа такого
Код

//1.cpp
int f()
{
}

// 2.cpp
int f ();
int f_from_1 ()
{
  return f();
}
static int f() {
 return f_from_1 ();
}

не знаю по умолчанию какое связывание в Ansi, если не внешнее то добавить extern..


Это сообщение отредактировал(а) mes - 19.2.2010, 14:15


--------------------
PM MAIL WWW   Вверх
Dagger
Дата 19.2.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

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



Довольно трудно для понимания, но я попробую и отпишусь.
> тогда в одном файле функция должна быть объявлена с внешним связыванием
Забыл написать (а зря), что у меня нет права менять код в (1) – foo1.c / foo1.h
PM MAIL WWW Skype   Вверх
bsa
Дата 19.2.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Dagger, сочувствую. Функция int main(int, char**) является стандартной точкой входа в программу. Таким образом, линкер автоматически с ней связывает startup код. Если две таких функции, то будет ошибка линковки. Поэтому, чтобы обойти это, нужно изменить соответствующим образом startup код и название своей функции main (основной точки входа).
PM   Вверх
Dagger
Дата 19.2.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

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



Цитата(bsa @ 19.2.2010,  11:30)
Dagger, сочувствую. Функция int main(int, char**) является стандартной точкой входа в программу. Таким образом, линкер автоматически с ней связывает startup код. Если две таких функции, то будет ошибка линковки. Поэтому, чтобы обойти это, нужно изменить соответствующим образом startup код и название своей функции main (основной точки входа).

Спасибо за ответ. По ходу прийдется скопировать код с (1) main'а
PM MAIL WWW Skype   Вверх
EvilsInterrupt
Дата 21.2.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



Dagger, 
Можно и не копировать ;) Для этого ты :
1) Изучаешь исполнимый файл после этого компилятора
2) Находишь байты, которые относятся к началу int main
3) В своем коде создаешь тип указателя на int main и объявляешь переменную этого типа
4) в переменную присваиваешь адрес найденных на int main байтов
5) Вызываешь

Да, но для этого всего придется писать загрузчик PE или если у тебя Линукс ELF файлов. Все это не просто и требует опыта копания в исполнимых файлах ;)

PM MAIL WWW ICQ Jabber   Вверх
Dagger
Дата 22.2.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 377
Регистрация: 4.9.2002
Где: Киев

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



Цитата(EvilsInterrupt @ 21.2.2010,  08:01)
Dagger, 
Можно и не копировать ;) Для этого ты :
1) Изучаешь исполнимый файл после этого компилятора
2) Находишь байты, которые относятся к началу int main
3) В своем коде создаешь тип указателя на int main и объявляешь переменную этого типа
4) в переменную присваиваешь адрес найденных на int main байтов
5) Вызываешь

Да, но для этого всего придется писать загрузчик PE или если у тебя Линукс ELF файлов. Все это не просто и требует опыта копания в исполнимых файлах ;)

у меня мак ос. Но такое решение не проходит – я написал враппер для опенсорцной библиотеки на питоне. Он должен одинаково собираться как на solaris (моя серверная платформа), так и на мак ос и линуксе.

Итого скопировать код main функции было самым правильным решением – парень который писал либу оказался недальновидным проектировщиком, поэтому я еще и импрувил его код ,)

Это сообщение отредактировал(а) Dagger - 22.2.2010, 11:26
PM MAIL WWW Skype   Вверх
xvr
Дата 26.2.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Можно сделать обвертку вокруг foo1.c, перебив с помощью #define main на что нибудь свое:
Код

// my_foo.c
#define main foo_main
#include "foo1.c"
В проект включать my_foo.c и НЕ включать foo1.c

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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