Статические и динамические библиотеки в одном проекте. (Как сделать?)
Модератор: Модераторы разделов
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Статические и динамические библиотеки в одном проекте.
Доброго времени суток!
Имеются два рабочих проекта.
Первый: использует только динамические библиотеки, нормально собирается и работает. В исходниках.
Второй: используется одна статическая библиотека (с h-фвйлами, но без исходниов), нормально собирается и работает. Сам проект в исходниках.
Требуется: подключить и использовать статическую библиотеку из второго проекта в первом.
Подключил библиотеку, положил h-файлы в нужные каталоги, начал собирать проект... а он не собирается.
Причём ошибки какие-то странные, что-то типа "не найдена функция XXX". Эта же функция в отдельном проекте находится и работает.
Что я сделал не так?
Имеются два рабочих проекта.
Первый: использует только динамические библиотеки, нормально собирается и работает. В исходниках.
Второй: используется одна статическая библиотека (с h-фвйлами, но без исходниов), нормально собирается и работает. Сам проект в исходниках.
Требуется: подключить и использовать статическую библиотеку из второго проекта в первом.
Подключил библиотеку, положил h-файлы в нужные каталоги, начал собирать проект... а он не собирается.
Причём ошибки какие-то странные, что-то типа "не найдена функция XXX". Эта же функция в отдельном проекте находится и работает.
Что я сделал не так?
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Прямой путь к библиотеке не пробовали прописать?
Shell
$ g++ test.cpp /path/foolib.a -o test
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Пробовал. Только не просто так, а в LIBS (без -l). Как и рекомендуется в таких случаях. Не помогает.
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Ну значит библиотека не подключилась, уже не помню, там есть свои проблемы в LIBS, что то было когда то похожее. Можно конечно ещё поиграться с --bstatic и -bdynamic. Но вроде ещё был вариант использовать так: -l:lib.a. Тут надо было посмотреть как выглядела последняя команда компилятора в момент вывода ошибки.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Это просто проверяется: делается ошибка в имени библиотеки и если она не находится, значит, в первом случае, подключалась.

Ошибки будут на момент линковки, а не компиляции.
Тут непонятка то другая - код подключения и вызова функции просто переносится из одного проекта в другой проект. На той же самой системе. Компилятор тот же самый. Как и линковщик.
Добавлено (13:32):
-l это динамическая линковка.
-
- Сообщения: 2940
- ОС: Gentoo
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Не работает. Где-то глубже собака зарыта, ещё бы знать, где...
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Скорее всего ещё чего то не хватает кроме этой библиотеки из того проекта. Обычно если не хватает ещё связей при линковке выводится ошибка undefined reference to.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Оно так и выводит, только по русски.

Вряд ли так может быть, чтобы из библиотеки вызывались бы функции другой библиотеки. Или может?
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Да как бы не должно, если только они не переопределяются в проекте. Тут нужно смотреть полный вывод команды g++ в момент вывода этого сообщения - какая она была на тот момент. Её нужно просмотреть скорее в ней дело. Можно попробовать в ручную ее выполнить, ошибка должна повториться, конечно проделать это нужно после запуска make. Скорее всего в этой команде отсутствует подключение к статической библиотеке.
-
- Модератор
- Сообщения: 21115
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Статические и динамические библиотеки в одном проекте.
Пальцем в небо: порядок аргументов перепутали. Библиотека в команде линковки должна идти до объектов, использующих определённые в ней символы (хотя в современных линковщиках это, вроде бы, не обязательно).
Добавлено (15:56):
Почему нет?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Палец и небо - это хорошо.Bizdelnick писал: ↑28.03.2021 15:50Пальцем в небо: порядок аргументов перепутали. Библиотека в команде линковки должна идти до объектов, использующих определённые в ней символы (хотя в современных линковщиках это, вроде бы, не обязательно).

И этого вполне хватало... до текущего момента.
Потому, что тогда (если по хорошему) нужны ещё описания функций второй библиотеки. Не, с целью запутать мозги программеру - путь хороший, конечно. Но, вряд ли так кто делает...
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Статические и динамические библиотеки в одном проекте.
Может. Посмотрите вывод ldd для любой программы, сложнее hello world. Там большая часть вызовов - это библиотеки вызывают друг друга.
По теме. Вроде бы это давно известная проблема.
Я с чем-то таким сталкивался, но деталей уже не помню.
Попробуйте указать порядок линковки: сначала вся статика, потом динамика. Возможно, у Вас сейчас получается так, что статика линкуется вместе с динамикой,(попадает под один ключ), поэтому не может.
И вообще, покажите команду, как у Вас всё это собирается.
Добавлено (17:08):
Здесь нужно понимать, что IDE вообще-то -- дура железная. Ей всё объяснять надо.
Команды, составленные этой автоматикой зачастую не годятся для сложных случаев. Поэтому нормальный сборочный инструмент обычно поддается дрессировке.
-
- Модератор
- Сообщения: 21115
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Статические и динамические библиотеки в одном проекте.
Тут проблема в том, что Вы не сказали, что там у Вас за IDE, что прописано в файле проекта, и не показали команду линковки с её полным выводом. Так что кроме пальца и неба ровным счётом ничего не остаётся.devilr писал(а): ↑28.03.2021 16:55Палец и небо - это хорошо.Тут ещё проблема в том, что современные IDE избавляют программиста от "нужного порядка". Обычно берётся готовый файл проекта и добавляется в неё (в моём случае), где находятся сама библиотека и файлы описания вызова библиотечных функций. И собирается проект.
К сведению: в команду линковки объекты и библиотеки, как правило, попадают в том же порядке, в каком прописаны в файле проекта. Так что ни от чего IDE программиста не избавляет, только дополнительно запутывает, как правило.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Судя по всему та же самая - qtcreator. Причем использует проекты QT .pro, не cmake.
Спасибо сказали:
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
А вы умеете угадывать - она самая.

Причём там всё ещё запутаннее - пишу то я в linux, а вот отдам результат под оффтопик. До этого времени этот подход работал и вот найдены первые грабли, видимо.
Сейчас попробую сделать "проект" с единственным пустым файлом main.cpp и библиотекой и попробую собрать. Причём, очень может быть, что проблема будет в самой библиотеке. Ну, или в творении Билла, как часто бывает...
-
- Сообщения: 2940
- ОС: Gentoo
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
От неё. Там всё сложнее, мне не хотелось сильно заморачиваться, поэтому я взял виндовую статическую библиотеку и прикрутил к проекту. А сам проект собирал с линуксовой библиотекой. И разрулил дефайнами. В линуксе всё собирается и работает, а вот с виндой - первый раз такие грабли.
Впрочем, похоже, что проблема именно в той библиотеке - в простейшем проекте с ней те же ошибки. Попробую разрулить.
P.S. Почему именно так - у каждого свой путь. Я так делаю (сборка под linux, потом пересборка заказчику под win) просто потому, что в оффтопике нет ccache. И так получается банально быстрее.
Да и лицензии под оффтопик тоже нет. Поэтому - виртуалка с пробной версией оффтопика.
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Статические и динамические библиотеки в одном проекте.
Какой подход?
Если я Вас правильно понял, Вы используете IDE и у Вас есть проект, который нормально собирался.
Теперь туда понадобилось добавить статическую библиотеку. Когда Вам выше сказали про порядок линковки, Вы сослались на то, что IDE, дескать, "избавляет". Так у проекта обычно есть настройки. Ну, то есть где-то там в настройках, (и/или в свойствах проекта) указывается, кто статика, кто динамика и вообще, кто на ком стоял.
Вы сейчас по сути вмешались в работу готового проекта и добавили туда то, чего там изначально не было. Разумеется, нужна корректировка этих самых настроек. Вы их корректировали?
-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Хм, я так понял библиотека с расширением .lib, с ней вполне могут быть проблемы. Как то пробовал собирать у меня mingw от qtcreator не принимал эти библиотеки, при этом mingw под linux собранный crossdev нормально связался, хотя компилятор у меня под linux был также ещё поновее.
Может стоит попробовать использовать компилятор от Visual Studio.
Может стоит попробовать использовать компилятор от Visual Studio.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Я просто в проект добавил подключение этой самой библиотеки, а в один из файлов подключил header и сделал несколько вызовов функций из этой библиотеки. Как 100500 раз до этого. И всё работало.
Только библиотеки до сегодняшнего момента были динамическими.
Сейчас посмотрю вызов этих функций из работающего win-проекта. Очень может быть, что банально понадеялся на header. Точнее на то, что регистр названий функций совпадает с их описанием в h-файле...
Добавлено (18:39):
Там и так VS. Я эти грабли знаю.

-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Там в придачу к статической библиотеке скорее всего должна быть ещё dll-ка.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
DLL - это Dynamic Link Library. Зачем она "в придачу к статической библиотеке"?

-
- Сообщения: 2940
- ОС: Gentoo
Re: Статические и динамические библиотеки в одном проекте.
Это же винда, там все не так как у людей, хоть она и статическая, но она всего лишь прослойка для связывания с динамической. Я уже так собирал QT5 под Linux для винды, там для сборки драйвера Mysql для qt5, которой нет в стандартном комплекте требовалась библиотека mariadb, так вот статическая там являлась только прослойкой, и драйвер соответственно не будет работать без dll библиотеки.
Обычно dll библиотека находится в том же каталоге что и .lib.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Даже так? А Билли более талантлив, чем я предполагал

-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Статические и динамические библиотеки в одном проекте.
Так в этом всё и дело. Статические и динамические библиотеки линкуются разными ключами.
Если это специально не указать, всё будет линковаться одинаково и, понятное дело, не сработает.
При этом в команде обычно сначала статика, а динамика "в хвосте" команды сборки. Всё, что после этого ключа, воспринимается как динамика. Поэтому, если "новая" библиотека добавляется тупо в конец команды, она вероятней всего будет линковаться как динамика, даже если библиотека статическая.
Вот поэтому в IDE или другом сборочном инструменте должны быть настройки, чтобы точно указать, кто статика, кто динамика, что с чем соединяется.
Ну, то есть в данном конкретном случае не исключено, конечно, что причина в самой библиотеке (и тот факт, что она виндовая может оказывать влияние), но вообще линковка статики вместе с динамикой -- это всегда потенциальный источник проблем. Мне уже несколько раз доводилось подправлять сборку при создании линуксовых пакетов под слаку.
Насколько я помню, это такая "обертка", чтобы всё можно было линковать под ключом динамики.
Но тогда именно эту обертку и надо указывать в качестве линкуемой библиотеки. Или наоборот, статика -- обертка для динамики. Точно не припомню.
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Я знаю это всё. В третьем посте про ключи писал.Hephaestus писал: ↑28.03.2021 19:15Если это специально не указать, всё будет линковаться одинаково и, понятное дело, не сработает.
Пока выяснилось, что проблема именно в библиотеке. Или в её использовании. В любом случае, нашёл её на гитхабе, попробую собрать без чужих рук (в смысле, без использования сторонних "специально настроенных" репозиториев "под винду").
Если что, раскрою карты. Проект: Qt + OpenCV + Tesseract. В linux всё заработало сразу же, а вот в творении великого Билла - "фиг вам".
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: Статические и динамические библиотеки в одном проекте.
Я это всё к тому, что Вы понадеялись на IDE, дескать, "IDE избавляет".
Так вот, надо смотреть, как и что она там расставила. Очень часто добавляется именно "в хвост команды".
-
- Сообщения: 3689
- ОС: Mandriva => Gentoo (~amd64)
Re: Статические и динамические библиотеки в одном проекте.
Там всё гораздо банальнее, чем вы привыкли видеть в "нормальных IDE".Hephaestus писал: ↑28.03.2021 19:49Я это всё к тому, что Вы понадеялись на IDE, дескать, "IDE избавляет".
Один файл проекта. На базе которого "рождается" файл .user. Ну и Makefile.
Всё прозрачно.
Но, вот то, что сама библиотека может быть "не такой" - я как раз и не ожидал. Сейчас, медленно и нудно, собираю в оффтопике саму libtesseract, потом прикреплю её к своему проекту и, скорее всего, на этом ветка кончится.
Естественно, подробности опишу здесь, чтобы самому потом не забыть. Тупой карандаш лучше острой памяти.

-
- Сообщения: 2940
- ОС: Gentoo