LINUX.ORG.RU

Создание динамических библиотек gcc/g++

 ,


1

1

Создание динамических библиотек, написанных на C, для взаимодействия с ПО, написанном на C++. Вопросы: 1.Правильно ли будет создать структуру, содержащую входные данные и переменные для выходных данных и передать динамической библиотеке только указатель на эту структуру? 2. Какой командой собрать динамическую библиотеку на gcc? 3. Какой командой собрать приложение для взаимодействия с динамической библиотекой?

Необходимо всё это для того, чтобы зашить код, который используется без qt в .so/.dll «https://github.com/k-savelev/tmm_1» - такая реализация сейчас в visual studio, вроде работает, но мне кажется неправильно (хотя я получаю данные, которые мне нужны). И я не понимаю зачем сначала линковать к ПО статическую либу. Буду рад, если услышу много критики в свой адрес и напутствие с указанием правильного пути в виде ссылок на четкие мануалы, мануал от майкрософт меня только запутал. Буду рад так же мануалам, которые объяснят как правильно и безопасно взаимодействовать с библиотеками. Заранее спасибо. Да прибудет с вами сила.



Последнее исправление: k_savelev (всего исправлений: 1)

1.Правильно ли будет создать структуру, содержащую входные данные и переменные для выходных данных и передать динамической библиотеке только указатель на эту структуру?

Скорее всего не правильно. Во первых может отличаться выравнивание структур там где передаешь и там куда передаешь. Во вторых добавление членов в структуру сразу сломает аби и апи. Дизайн интерфейса - это отдельное искусство, лучше почитай что-нибудь про это. Можно начать с платформо-независимых типов или типа того. Обрати внимание на многопоточность, не возвращай из библиотеки глобальные или полуглобальные объекты. Ещё будет не плохо задуматься о выделении и освобождении памяти, в библиотеке и в приложении это может работать по разному. Ну и про другие ресурсы стоит подумать.

anonymous
()

В целом выходные параметры - плохая идея. Со структурой тем более: выходит в нее входит несколько логических кусков информации.. А язык то какой интерфейса, си или c++? На плюсах все легче, есть исключения есть optional есть error code можно, например, variant использовать..

zerhud
()
Ответ на: комментарий от anonymous

туда, куда передаю данные extern struct объявлено в начале. структура занимает 360 байт в стеке. можно конечно выделить память в куче, но зачем? это медленнее, я не перегружаю стек. Члены в структуру не добавляются, но меняются значения переменных в структуре. Зачем в простой задаче несколько потоков? я ничего не возвращаю из либы. я передаю в либу только указатель.

k_savelev
() автор топика
Ответ на: комментарий от zerhud

Можно объявить две структуры (вход и выход) или вовсе передать в функцию 4 значения double (они не меняются и можно передать «по значению»), а забирать уже значения из выходной структуры. интерефейс на плюсах, чуваки, добавил ведь код на гитхабе. Либа на C Интерфейс С++ with Qt libs.

k_savelev
() автор топика
Ответ на: комментарий от k_savelev

ну, так тем более, раз на плюсах. выходные параметры используют обычно в си, чтобы возращаемое значение спользовать как код ошибки. такой потребности нет, значит они не нужны вовсе. (тут я подразумеваю заполнение полей в структуре разновидностью выходного параметра.)

вовсе передать в функцию 4 значения double (они не меняются и можно передать «по значению»), а забирать уже значения из выходной структуры

хороший вариант. только то, что они не меняются, и то, что их можно передавать по значению не связанно никак. обычно, когда не меняются, передают константной ссылкой, но в данном случае это не существенно, так как это double. если в параметрах была бы структура с 4 double, то ее можно было бы передавать как const foo& p1 раз она не меняется внутри.

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

я ничего не возвращаю из либы

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

zerhud
()
Ответ на: комментарий от zerhud

Да, выходные это не return 1; Я имел ввиду Входные и выходные данные для расчета.

Либо не возвращает в функцию main значения, она просто меняет значения переменных через указатель.

В любом случае я понял что то, что я делаю, допустимо

k_savelev
() автор топика
Ответ на: комментарий от SR_team

да, медленее. вот я и говорю, что не очень-то хорошо использовать возращаемое значение таким образом (тут конечно основное, что нарушается абстракция + это не удобно, черевато ошибкам, ну да + по медленее, но это не так уж критично).

zerhud
()
Ответ на: комментарий от k_savelev

В любом случае я понял что то, что я делаю, допустимо

допустимо все что угодно, что написал, то и работает. программирование в том, чтобы сделать это понятным и простым, а не только в том, чтобы оно работало (если конечно не нужно просто потом выкинуть код).

zerhud
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.