Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Статическая библиотека: убрать зависимость от внутренних библиотек

#cpp #lib #visual_studio

                    
Есть самописная библиотека С++ (.h и .cpp соответственно) использующая библиотеки
OpenCV и boost. 
Заголовочный файл имеет вид:
#include 
#include 
#include 
using namespace boost::numeric::ublas;
и дальше объявления классов и функций (реализованных в cpp)

Использую VS2010, если к проекту "напрямую" подкючать эту библиотеку, прописывать
все необходимые файлы для работы openCV и boost, то все работает.
Пробовал собрать статическую библиотеку lib. Подключаю заголовочный файл подключаю
lib файл к новому проекту и компилятор ругается на неизвестные ему библиотеки:  cv.h
и тп... 
Как можно создать статическую библиотеку, так что бы человеку которому необходимо
написать прогу с использованием самописной библиотеки, не надо было иметь собранные
OpenCV и boost.    


Ответы

Ответ 1



boost::ublas — это header-only library, поэтому к вопросу она отношения не имеет. То есть тому, кто захочет использовать вашу штуковину, нужно будет иметь хэдеры boost'a, и в этом никакой проблемы лично я не вижу. Далее, правильное решение с OpenCV следующее — не нужно embedd'ить весь OpenCV в вашу библиотеку, а нужно поставлять библиотеку as is, а всех пользователей вашей библиотеки отправлять на opencv.org Решение с embedd'ингом плохое, поскольку вы лишаете пользователей вашей библиотеки возможности динамически линковаться с OpenCV и форсируете увеличение размера любого приложения, собранного с применением вашей библиотеки. Также embedd'инг всего OpenCV в вашу библиотеку чреват проблемами с безопасностью. Что должен сделать пользователь вашей библиотеки, в которую статически влинкован OpenCV 2.4.5, если он узнает, что в 2.4.5 нашли exploit, который позволяет получить доступ к любой системе? OpenCV, скажем, выпускает для этого патч-релиз 2.4.6, а ваш пользователь кусает локти. Последний пример, разумеется, сильно притянут за уши, но аргумент вполне себе имеет место быть. Если вы все-таки решите статически embedd'ить OpenCV в вашу библиотеку, то в Visual Studio это можно сделать, например, с помощью приложения LIB. Вам нужно взять файл вашей библиотеки и файл статически собранной библиотеки OpenCV, сдампить из них obj файлы и склеить эти файлы в новую библиотеку, которую и отправлять пользователю.

Ответ 2



Доброго времени суток! На мой взгляд тут два варианта: 1) Собираем библиотеку и компонуем ее со сторонними библиотеками статически, но нашу библиотеку делаем компонуемой динамически + пишем к ней интерфейс убрав все упоминания о заголовочных файлах boost и OpenCV. Пользователю предоставляем нашу библиотеку + наши заголовочные файлы. 2)Собираем библиотеку и компонуем ее со сторонними библиотеками статически, и нашу библиотеку также делаем статической. Затем пользователю Вам необходимо будет предоставить Вашу либу + все заголовки (как Вашей библиотеки, так и сторонних). Других способов нет - по крайней мере они мне не известны

Комментариев нет:

Отправить комментарий