Member 13740197 Ответов: 1

Как создать библиотеку общих объектов с помощью qt C++


Привет,

У меня есть требование создать библиотеку общих объектов(.so) для qt project C++. Я должен использовать эту библиотеку в другом проекте. Это означает, что функции, которые я должен вызвать из другого проекта.

Не могли бы вы, пожалуйста, помочь мне, как создать библиотеку. Я использую версию Qt4.7 в среде Linux.

Что я уже пробовал:

Пример:
У меня есть проект abc.pro
abc.cpp содержит функцию abc::display()

Теперь у меня есть еще один проект xyz.pro
xyz.cpp содержит функцию xyz::show()
Так из Show() функция у меня есть для вызова функции отображения, и я должен использовать проект ABC, как ABC.так как библиотека.
Как сделать это возможным.

11917640 Member

Если вы используете Qt Creator, у него есть пункт "библиотека C++" в диалоговом окне файл - новый файл или проект.

1 Ответов

Рейтинг:
10

Richard MacCutchan

Точно так же вы создаете любую библиотеку общих объектов: linux create shared object - поиск в Google[^].


Member 13740197

Спасибо за ответ.
Ссылка, которую вы отправили, дает объяснение о создании библиотеки с использованием файлов .c. Но в моем случае весь проект qt(который состоит из классов и функций по умолчанию, из-за этого я не мог конвертировать в файлы .cpp) должен быть преобразован в библиотеку.

Richard MacCutchan

Не имеет значения, на каком языке находится исходный код в C или C++, библиотека общих объектов создается из результирующих объектов. Я бы посоветовал вам прочитать справочные страницы для ld(1): GNU linker - Man-страница Linux[^].

Member 13740197

Я пробовал с объектными файлами, как показано ниже
ССЗ -общая -о библиотеке libc.так camcapture.захват-победа о'.о нажатии Ctrl-вкладка.о конструкторе.общие-вкладка вывода.о glMsgDialog.о формате JSON.о главном.о qrc_rsc.о qv4l2.о v4l2-АПИ.о

Но я получаю ниже ошибки

/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
/usr/bin/ld: camcapture.o: перемещения в generic ELF (EM: 40)
camcapture.o: ошибка добавления символов: файл в неправильном формате
collect2: ошибка: ld вернул 1 статус выхода


Что это за ошибка и нужно ли мне что-то делать с командными и объектными файлами ld.

Richard MacCutchan

Как и было сказано, объектный файл имеет неправильный формат.

Member 13740197

На самом деле объектные файлы, которые я взял из папки проекта qt после сборки.

Richard MacCutchan

Ну, они все еще находятся в неправильном формате.

Member 13740197

Привет
У меня есть решение для этого. Я создал библиотечный проект с qt, используя новую библиотеку project->OtherProject->C++. После сборки проекта в папке проекта создаются четыре общие библиотеки, такие как abc.s0, abc.so.1, abc.so.1.0 и abc.so.1.0.0.

Я использовал эти библиотеки в другом проекте, который успешно запущен. После запуска этого exe в target я получил ошибку ниже

./mycam: ошибка при загрузке общих библиотек: abc.so.1: не удается открыть общий объектный файл: нет такого файла или каталога

Что это за ошибка и как ее устранить, не могли бы вы мне помочь?

Richard MacCutchan

Послание совершенно ясное. Вы пытаетесь сослаться на файл, который загрузчик не может найти. Вам нужно добавить путь к этим файлам в системный путь поиска библиотек или скопировать их все в то же место, что и исполняемая программа.

Member 13740197

Спасибо за ответ, теперь я могу запустить свое приложение. Но у меня есть еще одна проблема. Моя библиотека содержит графический интерфейс, который использует файл ресурсов для изображений.
И я также добавил этот файл ресурсов в свое приложение, но когда я запускаю свое приложение, эти изображения не отображаются. Так как же сделать это возможным для отображения, не могли бы вы, пожалуйста, помочь.

Richard MacCutchan

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

Member 13740197

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

m_capStartAct = new QAction(QIcon(":/images/record.png"), "&Start Capture", this);
QAction *quitAct = новый QAction(QIcon(":/картинки/выход.ПНГ"), "&амп;бросить курить", это);
QToolBar *панель инструментов = addToolBar("");
панель инструментов->setObjectName("панель инструментов");
панель инструментов->addAction(m_capStartAct);
панель инструментов->addAction(quitAct);

Здесь образы записывать.формат PNG &ампер; выход.ПНГ присутствуют в файле ресурсов РКК.разводка.

Но когда я использую эту библиотеку в другом приложении, изображения не отображаются(означает пустую кнопку), и функция работает нормально. Я добавил Эти изображения в свое приложение в качестве файла ресурсов, но все равно изображения не отображаются. Можете вы пожалуйста помочь мне.

Richard MacCutchan

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