|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
||||||||||||||||
Программа с библиотеками калькулятора. Не могу собрать04.04.2016, 10:48. Показов 2629. Ответов 38
Метки нет (Все метки)
Максимально подробно. Есть компьютер с win7 на котором виртуальная машина ubuntu. Пишу в codeblocks под win, собираю в ubuntu.
Задание было написать библиотеку реализующие функции калькулятора. На выходе библиотека, файл использующий ее, заголовочный файл. исходный код библиотеки calc.c: Кликните здесь для просмотра всего текста
Файл main.c использующий библиотеку: Кликните здесь для просмотра всего текста
и заголовочный файл mylib.h: Кликните здесь для просмотра всего текста
Все это дело я закинул в общую папку между win и ubuntu. В терминале ubuntu получил обьектный calc.o файл: gcc -c calc.c Далее создал статическую библиотеку libmy1.a из файла calc.o: ar r libmy1.a *.o Удалил обьектные файлы: rm *.o Хотел создать обьектный файл из main.c: gcc -c main.c Но увидел ошибку: Кликните здесь для просмотра всего текста
main.c: In function ‘main’:
main.c:33:3: error: expected ‘;’ before ‘case’ case '0': return 0" что я делаю не верно? прикладываю файлы.
0
|
||||||||||||||||
| 04.04.2016, 10:48 | |
|
Ответы с готовыми решениями:
38
Не могу разобраться с библиотеками VB6: не могу скомпилировать exe-файл со встроенными библиотеками |
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
||||||
| 07.04.2016, 12:57 | ||||||
|
Я как понял одна функция - одна библиотека. Вам нужно использовать динамическую загрузку(dlopen,dlsym) библиотек и их функций. Для загрузки списка плагинов можно использовать opendir,readdir.
Для начала вам нужно разработать интерфейс функций калькулятора. Это набор импортируемых функций для каждого плагина. Например:
В клиентской программе будем загружать динамический и формировать список(лучше динамический массив) плагинов, и используя загруженные указатели на функции,можно их запускать для получения результата. В этом ничего особо сложного нет, но просто много механической работы.
0
|
||||||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|||||||||||
| 07.04.2016, 14:01 [ТС] | |||||||||||
|
nikolay1982, давайте попробуем по порядку? я не совсем понял как реализовать то что вы предложили, но это бесспорно именно то что требуется в задании.
1. Я создаю четыре файла, в каждом 1 функция (+,-,*,/). 2. Создаю 4 динамические библиотеки, с названиями функций (libadd.so и т.д.) Как мне подключать их в свой файл main.c? какой должен быть заголовочный файл (или его вообще не должно быть)? Допустим я с помощью
затем
а если библиотеки нет? то как она откроет только те которые смогла найти? я запутался окончательно.
0
|
|||||||||||
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
|
| 07.04.2016, 14:13 | |
|
Вы можете контролировать загрузку dll, dlopen возвращает NULL, если не удалось загрузить библиотеку.
К кому же я предлагал использовать opendir,readdir для получения списка существующих плагинов(из папки plugins, как в задании). Сделайте это сначала с одной библиотекой-плагином, если сможете сделать, то легко сделаете остальные три.
0
|
|
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|
| 07.04.2016, 14:27 [ТС] | |
|
nikolay1982, я загружу список библиотек из папки plagins, мне же нужно их куда присвоить, нужен массив указателей? и потом открывать каждый указатель функцией dlopen?
0
|
|
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
|
| 07.04.2016, 14:42 | |
|
Не обязательно. Да вам нужен массив, что в него вы будете записывать, это надо продумать структуру данных.
Можно по обходу файлов в директории сразу загружать нужные функции. При этом имена(пути файлов) вам нужны только временно.
0
|
|
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|||||||||||
| 08.04.2016, 07:16 [ТС] | |||||||||||
|
nikolay1982, смотрите
Добавлено через 4 минуты и я вообще правильно ее загружаю?
0
|
|||||||||||
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
|||||||
| 08.04.2016, 09:03 | |||||||
Сообщение было отмечено tarakan.nvkz как решение
Решение
Первый раз я увидел не этот код, вы его правили что ли.
void *dlsym(void *handle, char *symbol); symbol - задает имя функции- помните, я говорит, что нужно задать интерфейс, то есть систему имен функций, которая будет одинаковой для всех плагинов. В моем примере это double calFunc(double a,...); -> symbol="calFunc". Но это определение с ... может показаться непонятным, поэтому более простое double calFunc(double a,double b); Теперь как вызывать функцию. Стандартные правила для указателя на функцию.
1
|
|||||||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
||||||||
| 08.04.2016, 13:13 [ТС] | ||||||||
|
nikolay1982, в вашем примере вы работаете с функцией
Затем вы в этот же указатель загружаете функцию из библиотеки, причем в symbol пишите "calcFunc", которая больше нигде не используется, то есть непонятно зачем вообще нужно это имя функции. А если у меня будет 2 функции в библиотеке, как она узнает какую функцию поместить в myPlugin1_calFunc? Простите что так много вопросов, я просто очень хочу разобраться, и вижу что вы компетентный человек, который к тому же не отказывает в помощи. Добавлено через 21 минуту Добавлено через 6 минут nikolay1982, все действительно работает, теперь я наконец то понял как работает dlopen и dlsym! Теперь нужно с помощью opendir и readdir по одному считать все названия файлов из папки plugins, из тех которые являются библиотеками считать функции и предложить пользователю для выбора, если я правильно понимаю. Добавлено через 1 минуту nikolay1982, не могли бы вы подсказать как правильно работать с opendir и readdir? Добавлено через 2 часа 2 минуты
0
|
||||||||
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
||||||||
| 08.04.2016, 17:10 | ||||||||
|
Вы много вопросов задали,возможно вы не поняли что я в код добавил внутреннюю проверку.
Если раскоментировать эту строку, то будет работать по другому. Добавлено через 4 минуты Теперь простой пример с opendir,readdir:
0
|
||||||||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|
| 09.04.2016, 00:33 [ТС] | |
|
nikolay1982, хорошо, а как выполнить загрузку функций, то есть если их имена не calcFunc, а другие, как их показать/считать их на выбор?
0
|
|
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
||||||
| 09.04.2016, 08:00 | ||||||
|
создайте тип структуры в которой, будут хранится указатели на функции плагина.
Типа примерно:
Сначала заполнить его нулями. При обходе каталога с плагинами заполнить его загруженными функциями.
1
|
||||||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|
| 09.04.2016, 10:48 [ТС] | |
|
nikolay1982, огромное спасибо, в понедельник попробую написать, может еще что нибудь спрошу) вы мне очень помогли(помогаете).
0
|
|
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|||||||||||
| 11.04.2016, 14:23 [ТС] | |||||||||||
|
nikolay1982, сейчас сделал в пока в таком виде:
Кликните здесь для просмотра всего текста
Теперь проверяем, если файл является библиотекой, то считать из него функцию.То есть, лучше наверное сделать глобальную переменную, хранящую имя функции, которую она экспортирует. Имя переменной должно быть одинаково во всех библиотеках. И тогда, сначала нужно забрать переменную из библиотеки, а по ее значению, уже функцию. Я вот понимаю как это должно быть, ну то есть логику, а как конкретно реализовать пока не могу понять, опыта мало.. Добавлено через 1 час 25 минут nikolay1982, фактически, можно конечно было бы сделать чтобы после вывода списка библиотек в папке plugins, пользователь набирал название библиотеки, и так как там одна функция, происходило бы открытие набранной библиотеки, загрузка этой единственной функции, вывод результата и закрытие библиотеки. Но, я хочу сделать список функций, которые сейчас доступны из всех библиотек в папке plugins. То есть мне нужно создавать массив, в который я буду помещать названия библиотек(для того чтобы открыть их все) и массив в который я буду помещать названия находящихся в них функций(чтобы загрузить их в еще один массив), так? Добавлено через 5 часов 42 минуты nikolay1982, сделал вот так (костыли конечно, но заданию вроде соответствует) Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
||||||||||||||||
| 11.04.2016, 17:31 | ||||||||||||||||
|
Я же вам предлагал массив
не надо ничего мудрить. Один раз загружаем функции(при инициализации). И один раз выгружаем функции(при выходе из программы)
Простейщий плагин:
0
|
||||||||||||||||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
||
| 13.04.2016, 11:26 [ТС] | ||
|
0
|
||
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
||
| 13.04.2016, 12:16 | ||
|
Для этого применяются скрипты bash (для новичков неплохо, не требуется многих знаний) и Makefile.
0
|
||
|
1 / 1 / 0
Регистрация: 10.09.2011
Сообщений: 146
|
|
| 13.04.2016, 12:21 [ТС] | |
|
nikolay1982, с другой стороны я так лучше разбираюсь, что я вообще делаю, запоминаю команды gcc..
Добавлено через 1 минуту nikolay1982, еще, может посоветуете литературу, именно программирование в c под линукс? или можно иногда задавать Вам вопросы(если вас не затруднит конечно)?
0
|
|
|
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
|
|||
| 13.04.2016, 14:26 | |||
Вы столько раз компилировали, и еще не запомнили 4 опции компилятора gcc?Основы программирования в Linux (Мэтью); Самоучитель программирование в Linux(Иванов); Linux программирование в примерах(Роббинс): Статьи Андрея Боровского (очень хорошо для новичков). Эти источники не отменяют Linux/Posix man pages. Я использую manpages.chm(почти 5 Мб) (English) ( не помню, где скачал). Есть и на русском(частично), но в формате man. Если кто найдет manpages.chm на русском, то буду благодарен.
0
|
|||
|
657 / 410 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
|
||
| 13.04.2016, 19:52 | ||
|
1
|
||
| 13.04.2016, 19:52 | |
|
Не могу переписать модель для калькулятора Swift 3.0.1
Не могу собрать калькулятор Не могу собрать проект Не могу собрать формулу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool
Worker Pool — паттерн конкурентной обработки задач в Go.
Суть: фиксированное количество горутин-воркеров читают задачи из общего канала
и пишут результаты в общий канал результатов. . . .
|
|
[golang] Pipeline
alhaos 08.06.2026
Pipeline
Pipeline — паттерн конкурентной обработки данных в Go.
Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|