![]() |
|
Модераторы: bsa |
![]()
|
|
| Dagger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 377 Регистрация: 4.9.2002 Где: Киев Репутация: нет Всего: 8 |
У меня есть два файла. Как в первом так и во втором есть функция main.
Допустим (1) – foo1.c / foo1.h (2) – foo2.c / foo2.h Надо из (1) импортировать main и иметь возможность ее вызвать в (2). Как это реализовать? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
тогда в одном файле функция должна быть объявлена с внешним связыванием, а вторая статической,
а чтоб одну использовать в другой, нужно для первой задать другое имя. вобщем типа такого
не знаю по умолчанию какое связывание в Ansi, если не внешнее то добавить extern.. Это сообщение отредактировал(а) mes - 19.2.2010, 14:15 |
|||
|
||||
| Dagger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 377 Регистрация: 4.9.2002 Где: Киев Репутация: нет Всего: 8 |
Довольно трудно для понимания, но я попробую и отпишусь.
> тогда в одном файле функция должна быть объявлена с внешним связыванием Забыл написать (а зря), что у меня нет права менять код в (1) – foo1.c / foo1.h |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Dagger, сочувствую. Функция int main(int, char**) является стандартной точкой входа в программу. Таким образом, линкер автоматически с ней связывает startup код. Если две таких функции, то будет ошибка линковки. Поэтому, чтобы обойти это, нужно изменить соответствующим образом startup код и название своей функции main (основной точки входа).
|
|||
|
||||
| Dagger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 377 Регистрация: 4.9.2002 Где: Киев Репутация: нет Всего: 8 |
Спасибо за ответ. По ходу прийдется скопировать код с (1) main'а |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Dagger,
Можно и не копировать ;) Для этого ты : 1) Изучаешь исполнимый файл после этого компилятора 2) Находишь байты, которые относятся к началу int main 3) В своем коде создаешь тип указателя на int main и объявляешь переменную этого типа 4) в переменную присваиваешь адрес найденных на int main байтов 5) Вызываешь Да, но для этого всего придется писать загрузчик PE или если у тебя Линукс ELF файлов. Все это не просто и требует опыта копания в исполнимых файлах ;) |
|||
|
||||
| Dagger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 377 Регистрация: 4.9.2002 Где: Киев Репутация: нет Всего: 8 |
у меня мак ос. Но такое решение не проходит – я написал враппер для опенсорцной библиотеки на питоне. Он должен одинаково собираться как на solaris (моя серверная платформа), так и на мак ос и линуксе. Итого скопировать код main функции было самым правильным решением – парень который писал либу оказался недальновидным проектировщиком, поэтому я еще и импрувил его код ,) Это сообщение отредактировал(а) Dagger - 22.2.2010, 11:26 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Можно сделать обвертку вокруг foo1.c, перебив с помощью #define main на что нибудь свое:
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |