Статические и динамические библиотеки в одном проекте. (Как сделать?)

Модератор: Модераторы разделов

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Доброго времени суток!
Имеются два рабочих проекта.
Первый: использует только динамические библиотеки, нормально собирается и работает. В исходниках.
Второй: используется одна статическая библиотека (с h-фвйлами, но без исходниов), нормально собирается и работает. Сам проект в исходниках.
Требуется: подключить и использовать статическую библиотеку из второго проекта в первом.
Подключил библиотеку, положил h-файлы в нужные каталоги, начал собирать проект... а он не собирается.
Причём ошибки какие-то странные, что-то типа "не найдена функция XXX". Эта же функция в отдельном проекте находится и работает.
Что я сделал не так?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Прямой путь к библиотеке не пробовали прописать?

Shell

$ g++ test.cpp /path/foolib.a -o test
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Пробовал. Только не просто так, а в LIBS (без -l). Как и рекомендуется в таких случаях. Не помогает.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Ну значит библиотека не подключилась, уже не помню, там есть свои проблемы в LIBS, что то было когда то похожее. Можно конечно ещё поиграться с --bstatic и -bdynamic. Но вроде ещё был вариант использовать так: -l:lib.a. Тут надо было посмотреть как выглядела последняя команда компилятора в момент вывода ошибки.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 13:25
Ну значит библиотека не подключилась
Это просто проверяется: делается ошибка в имени библиотеки и если она не находится, значит, в первом случае, подключалась. :)
ormorph писал(а):
28.03.2021 13:25
Тут надо было посмотреть как выглядела последняя команда компилятора в момент вывода ошибки
Ошибки будут на момент линковки, а не компиляции.
Тут непонятка то другая - код подключения и вызова функции просто переносится из одного проекта в другой проект. На той же самой системе. Компилятор тот же самый. Как и линковщик.
Добавлено (13:32):
ormorph писал(а):
28.03.2021 13:25
Но вроде ещё был вариант использовать так: -l:lib.a.
-l это динамическая линковка.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

devilr писал(а):
28.03.2021 13:31
-l это динамическая линковка.
Ну это вроде как можно регулировать, как-то так:

Shell

g++ test.cpp -Wl,-Bstatic -lfoo -Wl,-Bdynamic
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Не работает. Где-то глубже собака зарыта, ещё бы знать, где...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Скорее всего ещё чего то не хватает кроме этой библиотеки из того проекта. Обычно если не хватает ещё связей при линковке выводится ошибка undefined reference to.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 14:18
Обычно если не хватает ещё связей при линковке выводится ошибка undefined reference to.
Оно так и выводит, только по русски. :) Беда в том, что те функции, на которые ругаются, находятся как раз в той библиотеке, которую я и подключаю.
Вряд ли так может быть, чтобы из библиотеки вызывались бы функции другой библиотеки. Или может?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

devilr писал(а):
28.03.2021 14:27
Вряд ли так может быть, чтобы из библиотеки вызывались бы функции другой библиотеки. Или может?
Да как бы не должно, если только они не переопределяются в проекте. Тут нужно смотреть полный вывод команды g++ в момент вывода этого сообщения - какая она была на тот момент. Её нужно просмотреть скорее в ней дело. Можно попробовать в ручную ее выполнить, ошибка должна повториться, конечно проделать это нужно после запуска make. Скорее всего в этой команде отсутствует подключение к статической библиотеке.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18483
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Bizdelnick »

Пальцем в небо: порядок аргументов перепутали. Библиотека в команде линковки должна идти до объектов, использующих определённые в ней символы (хотя в современных линковщиках это, вроде бы, не обязательно).
Добавлено (15:56):
devilr писал(а):
28.03.2021 14:27
Вряд ли так может быть, чтобы из библиотеки вызывались бы функции другой библиотеки. Или может?
Почему нет?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Bizdelnick писал:
28.03.2021 15:50
Пальцем в небо: порядок аргументов перепутали. Библиотека в команде линковки должна идти до объектов, использующих определённые в ней символы (хотя в современных линковщиках это, вроде бы, не обязательно).
Палец и небо - это хорошо. :) Тут ещё проблема в том, что современные IDE избавляют программиста от "нужного порядка". Обычно берётся готовый файл проекта и добавляется в неё (в моём случае), где находятся сама библиотека и файлы описания вызова библиотечных функций. И собирается проект.
И этого вполне хватало... до текущего момента.
Bizdelnick писал:
28.03.2021 15:50
Почему нет?
Потому, что тогда (если по хорошему) нужны ещё описания функций второй библиотеки. Не, с целью запутать мозги программеру - путь хороший, конечно. Но, вряд ли так кто делает...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Hephaestus »

devilr писал(а):
28.03.2021 14:27
Вряд ли так может быть, чтобы из библиотеки вызывались бы функции другой библиотеки. Или может?
Может. Посмотрите вывод ldd для любой программы, сложнее hello world. Там большая часть вызовов - это библиотеки вызывают друг друга.

По теме. Вроде бы это давно известная проблема.
Я с чем-то таким сталкивался, но деталей уже не помню.
Попробуйте указать порядок линковки: сначала вся статика, потом динамика. Возможно, у Вас сейчас получается так, что статика линкуется вместе с динамикой,(попадает под один ключ), поэтому не может.
И вообще, покажите команду, как у Вас всё это собирается.
Добавлено (17:08):
devilr писал(а):
28.03.2021 16:55
Тут ещё проблема в том, что современные IDE избавляют программиста от "нужного порядка".
Здесь нужно понимать, что IDE вообще-то -- дура железная. Ей всё объяснять надо.
Команды, составленные этой автоматикой зачастую не годятся для сложных случаев. Поэтому нормальный сборочный инструмент обычно поддается дрессировке.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 18483
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Bizdelnick »

devilr писал(а):
28.03.2021 16:55
Палец и небо - это хорошо. :) Тут ещё проблема в том, что современные IDE избавляют программиста от "нужного порядка". Обычно берётся готовый файл проекта и добавляется в неё (в моём случае), где находятся сама библиотека и файлы описания вызова библиотечных функций. И собирается проект.
Тут проблема в том, что Вы не сказали, что там у Вас за IDE, что прописано в файле проекта, и не показали команду линковки с её полным выводом. Так что кроме пальца и неба ровным счётом ничего не остаётся.
К сведению: в команду линковки объекты и библиотеки, как правило, попадают в том же порядке, в каком прописаны в файле проекта. Так что ни от чего IDE программиста не избавляет, только дополнительно запутывает, как правило.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Bizdelnick писал:
28.03.2021 17:23
Тут проблема в том, что Вы не сказали, что там у Вас за IDE
Судя по всему та же самая - qtcreator. Причем использует проекты QT .pro, не cmake.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 17:28
Судя по всему та же самая - qtcreator. Причем использует проекты QT .pro, не cmake.
А вы умеете угадывать - она самая. :)
Причём там всё ещё запутаннее - пишу то я в linux, а вот отдам результат под оффтопик. До этого времени этот подход работал и вот найдены первые грабли, видимо.
Сейчас попробую сделать "проект" с единственным пустым файлом main.cpp и библиотекой и попробую собрать. Причём, очень может быть, что проблема будет в самой библиотеке. Ну, или в творении Билла, как часто бывает...
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

devilr писал(а):
28.03.2021 18:04
Причём там всё ещё запутаннее - пишу то я в linux, а вот отдам результат под оффтопик.
Не понял, статическая библиотека от винды?
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 18:18
Не понял, статическая библиотека от винды?
От неё. Там всё сложнее, мне не хотелось сильно заморачиваться, поэтому я взял виндовую статическую библиотеку и прикрутил к проекту. А сам проект собирал с линуксовой библиотекой. И разрулил дефайнами. В линуксе всё собирается и работает, а вот с виндой - первый раз такие грабли.
Впрочем, похоже, что проблема именно в той библиотеке - в простейшем проекте с ней те же ошибки. Попробую разрулить.
P.S. Почему именно так - у каждого свой путь. Я так делаю (сборка под linux, потом пересборка заказчику под win) просто потому, что в оффтопике нет ccache. И так получается банально быстрее.
Да и лицензии под оффтопик тоже нет. Поэтому - виртуалка с пробной версией оффтопика.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Hephaestus »

devilr писал(а):
28.03.2021 18:04
До этого времени этот подход работал
Какой подход?
Если я Вас правильно понял, Вы используете IDE и у Вас есть проект, который нормально собирался.
Теперь туда понадобилось добавить статическую библиотеку. Когда Вам выше сказали про порядок линковки, Вы сослались на то, что IDE, дескать, "избавляет". Так у проекта обычно есть настройки. Ну, то есть где-то там в настройках, (и/или в свойствах проекта) указывается, кто статика, кто динамика и вообще, кто на ком стоял.
Вы сейчас по сути вмешались в работу готового проекта и добавили туда то, чего там изначально не было. Разумеется, нужна корректировка этих самых настроек. Вы их корректировали?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Хм, я так понял библиотека с расширением .lib, с ней вполне могут быть проблемы. Как то пробовал собирать у меня mingw от qtcreator не принимал эти библиотеки, при этом mingw под linux собранный crossdev нормально связался, хотя компилятор у меня под linux был также ещё поновее.
Может стоит попробовать использовать компилятор от Visual Studio.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Hephaestus писал:
28.03.2021 18:30
Вы их корректировали?
Я просто в проект добавил подключение этой самой библиотеки, а в один из файлов подключил header и сделал несколько вызовов функций из этой библиотеки. Как 100500 раз до этого. И всё работало.
Только библиотеки до сегодняшнего момента были динамическими.
Сейчас посмотрю вызов этих функций из работающего win-проекта. Очень может быть, что банально понадеялся на header. Точнее на то, что регистр названий функций совпадает с их описанием в h-файле...
Добавлено (18:39):
ormorph писал(а):
28.03.2021 18:38
Может стоит попробовать использовать компилятор от Visual Studio.
Там и так VS. Я эти грабли знаю. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

Там в придачу к статической библиотеке скорее всего должна быть ещё dll-ка.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 18:46
Там в придачу к статической библиотеке скорее всего должна быть ещё dll-ка.
DLL - это Dynamic Link Library. Зачем она "в придачу к статической библиотеке"? :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

devilr писал(а):
28.03.2021 18:51
DLL - это Dynamic Link Library. Зачем она "в придачу к статической библиотеке"?
Это же винда, там все не так как у людей, хоть она и статическая, но она всего лишь прослойка для связывания с динамической. Я уже так собирал QT5 под Linux для винды, там для сборки драйвера Mysql для qt5, которой нет в стандартном комплекте требовалась библиотека mariadb, так вот статическая там являлась только прослойкой, и драйвер соответственно не будет работать без dll библиотеки.
Обычно dll библиотека находится в том же каталоге что и .lib.
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

ormorph писал(а):
28.03.2021 19:06
Обычно dll библиотека находится в том же каталоге что и .lib.
Даже так? А Билли более талантлив, чем я предполагал :D
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Hephaestus »

devilr писал(а):
28.03.2021 18:39
Я просто в проект добавил подключение этой самой библиотеки, а в один из файлов подключил header и сделал несколько вызовов функций из этой библиотеки. Как 100500 раз до этого. И всё работало.
Только библиотеки до сегодняшнего момента были динамическими.
Так в этом всё и дело. Статические и динамические библиотеки линкуются разными ключами.
Если это специально не указать, всё будет линковаться одинаково и, понятное дело, не сработает.
При этом в команде обычно сначала статика, а динамика "в хвосте" команды сборки. Всё, что после этого ключа, воспринимается как динамика. Поэтому, если "новая" библиотека добавляется тупо в конец команды, она вероятней всего будет линковаться как динамика, даже если библиотека статическая.
Вот поэтому в IDE или другом сборочном инструменте должны быть настройки, чтобы точно указать, кто статика, кто динамика, что с чем соединяется.

Ну, то есть в данном конкретном случае не исключено, конечно, что причина в самой библиотеке (и тот факт, что она виндовая может оказывать влияние), но вообще линковка статики вместе с динамикой -- это всегда потенциальный источник проблем. Мне уже несколько раз доводилось подправлять сборку при создании линуксовых пакетов под слаку.
devilr писал(а):
28.03.2021 18:51
Зачем она "в придачу к статической библиотеке"?
Насколько я помню, это такая "обертка", чтобы всё можно было линковать под ключом динамики.
Но тогда именно эту обертку и надо указывать в качестве линкуемой библиотеки. Или наоборот, статика -- обертка для динамики. Точно не припомню.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Hephaestus писал:
28.03.2021 19:15
Если это специально не указать, всё будет линковаться одинаково и, понятное дело, не сработает.
Я знаю это всё. В третьем посте про ключи писал.

Пока выяснилось, что проблема именно в библиотеке. Или в её использовании. В любом случае, нашёл её на гитхабе, попробую собрать без чужих рук (в смысле, без использования сторонних "специально настроенных" репозиториев "под винду").
Если что, раскрою карты. Проект: Qt + OpenCV + Tesseract. В linux всё заработало сразу же, а вот в творении великого Билла - "фиг вам".
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Статические и динамические библиотеки в одном проекте.

Сообщение Hephaestus »

devilr писал(а):
28.03.2021 19:31
Я знаю это всё. В третьем посте про ключи писал.
Я это всё к тому, что Вы понадеялись на IDE, дескать, "IDE избавляет".
Так вот, надо смотреть, как и что она там расставила. Очень часто добавляется именно "в хвост команды".
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
devilr
Сообщения: 3144
ОС: Mandriva => Gentoo (~amd64)

Re: Статические и динамические библиотеки в одном проекте.

Сообщение devilr »

Hephaestus писал:
28.03.2021 19:49
Я это всё к тому, что Вы понадеялись на IDE, дескать, "IDE избавляет".
Там всё гораздо банальнее, чем вы привыкли видеть в "нормальных IDE".
Один файл проекта. На базе которого "рождается" файл .user. Ну и Makefile.
Всё прозрачно.
Но, вот то, что сама библиотека может быть "не такой" - я как раз и не ожидал. Сейчас, медленно и нудно, собираю в оффтопике саму libtesseract, потом прикреплю её к своему проекту и, скорее всего, на этом ветка кончится.
Естественно, подробности опишу здесь, чтобы самому потом не забыть. Тупой карандаш лучше острой памяти. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Спасибо сказали:

Аватара пользователя
ormorph
Сообщения: 1770
ОС: Gentoo

Re: Статические и динамические библиотеки в одном проекте.

Сообщение ormorph »

devilr писал(а):
28.03.2021 19:12
Даже так?
Ну не только так, ещё может находиться по пути PATH. Должен сказать после linux, где статика это статика, такие приколы просто выносят мозг.
Спасибо сказали: