LINUX.ORG.RU

Использовать систему сборки.

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

двухосточка

.a от слова Archive, это архив с .o файлами .so от слова Shared Objects, объекты общего пользования

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

Я почему спросил. Потому что мог заблуждаться. Допустим

libQt5Core.la
libQt5Core.prl
libQt5Core.so -> libQt5Core.so.5.9.1
libQt5Core.so.5 -> libQt5Core.so.5.9.1
libQt5Core.so.5.9 -> libQt5Core.so.5.9.1
libQt5Core.so.5.9.1
Может показаться, что для линковки с so файлами требуется la-файл. В то же время в /usr/lib/x86_64-linux-gnu наблюдаются подавляющее большинство именно *.a файлов, например libXext.a Хотя
ldd libQt5Gui.so
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6
Всегда, когда требовалось линковаться с SO, если не было la или a, то приходилось явно указывать файл, например LIBS+= -l /usr/lib/x86_64-linux-gnu/libXext.so.6

т.е. никакой роли для ликовки so-библиотек файл a не играет?

I-Love-Microsoft ★★★★★
()

Библиотеки с расширениями so, la, a - какую использовать?

Иди в винду и «используй» dll

anonymous
()

И еще вопрос как использовать объектные файлы, сделанные другим компилятором?

учитывая C++ в тегах, есть вероятность, что никак. но бывают исключения.

waker ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft
$ head /lib/libcanberra.la 
# libcanberra.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libcanberra.so.0'

# Names of this library.
anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Ты видимо слишком любишь m$ :)

В винде, lib файлы используются при линковке dll, что бы линкер мог построить таблицу импорта, и содержат в принципе заглушки функций из dll, которые ссылаются на реальные функции из dll. Как разрешаются там ссылки на данные, я если честно не в курсе.

В so файлах вся необходимая для линковщика инфа уже есть.

Как заметил анонимус, a файлы это архивы обьектников, называть их библиотеками, конечно можно, но по сути это просто удобный способ переносить кучу обьектников в одном файле, и тут процесс линковки ничем особо не отличается от линковки самих обьектов, архив распаковывается, обьектники линкуются к целевому бинарнику.

Всегда, когда требовалось линковаться с SO, если не было la или a, то приходилось явно указывать файл, например LIBS+= -l /usr/lib/x86_64-linux-gnu/libXext.so.6

4.2 даже в условиях qmake. Линкер ищет либу при использовании флага -l<name> по шаблону lib<name>.{so,a}.

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

Линкер ищет либу при использовании флага -l<name> по шаблону lib<name>.{so,a}

Ясно. Как много я не знаю про эту Вселенную... А ведь это просто GCC, даже не qmake-специфичная вещь. Хотя не раз наблюдал что некоторые so файлы требовали указания не только so он и их версии после so.1.2.3 Видимо что-то не так было настроено или указано, хз.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Соль как раз в том, что линкер не ищет чего то после суффиксов a|so. А всё это именование с версией в имени файла, костыль вместо майкрософтовских манифестов, которые позволяют в либу ряд стандартных, и много (х3 какой лимит) кастомных пар ключ/значение записать для хранения метаинформации. В юникс подобных, почему то такой подход не возник, и все кому надо, делают сиё вручную, через функции аля get_lib_version.

pon4ik ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

LIBS+= -l /usr/lib/x86_64-linux-gnu/libXext.so.6

Никогда не видел, чтобы кто-то линковал так so'шки. Вот так нужно:

LIBS += -L/usr/lib/x86_64-linux-gnu/ -lXext

А вот a'шки можно и тупо:

LIBS += /usr/lib/x86_64-linux-gnu/libXext.a

EXL ★★★★★
()
Ответ на: комментарий от pon4ik

и содержат в принципе заглушки функций из dll, которые ссылаются на реальные функции из dll

Я такое и с a'шками видел. Вместо нормальных объектников там были заглушки, а рядом so'шка. С какой целью не в курсе.

EXL ★★★★★
()

Библиотеки с расширениями .so, .la, .a - какую использовать?

Используй .dylib!

atsym ★★★★★
()
Ответ на: комментарий от waker

А как поступать в ситуации, когда в системе gcc 4.4, а для сборки либы нужно 4.8, я думал, что могу собрать либу на другой системе и использовать у себя?

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

В каких-то проприетарных SDK к каким-то карманным девайсам. Уже не вспомню, давно сталкивался.

Ну и как пример тебе такого решения, это библиотеки MinGW:

https://stackoverflow.com/questions/13998575/mingw-creating-dll-a-files-what-...

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

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

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

Вроде как эти lib и dll.a/a отличаются. Хотя я в ту степь особо не копал.

EXL ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Если ABI не поломан и зависимостей от конкретной libc нет, может и взлететь. Но не факт.

когда ты собираешь крестокод новым G++ — он прибивается гвоздями к новым кишкам libstdc++, которые не будут найдены при линковке более старым тулчейном.

совместимость ABI не спасет.

конкретно для glibc есть костыли, чтобы это порешать, для C++ решения не знаю.

edit: а кишки нового libstdc++, в свою очередь, скорее всего будут требовать более нового glibc, кстати.

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 2)
Ответ на: комментарий от waker

конкретно для glibc есть костыли, чтобы это порешать, для C++ решения не знаю.

Да точно такие же костыли есть, я собираю новым gcc, а релиз требует libstdc++ >= 4.8. Понятно, что новое из C++17, например, так не прикрутить, но для С++11/14 вполне хватает.

anonymous
()

so - это разделяемая библиотека. Существуюет в единственном экземпляре, и может использоваться сразу многими приложениями

a - это статическая библиотека, по сути это просто архив с набором объектных файлов которые прилинковываются к каждому приложению которое использует библиотеку.

.a желательно избегать, поскольку они раздувают бинарники, их неудобно линковать (все зависимости библиотеки с которой ты линкуешься нужно указывать явно, в случае .so же они обработаются автоматически; также нужно следить за порядком линковки) и они препятствуют обновлениию third party кода (т.е. если .so можно обновить на новую версию где была исправлена уязвимость, с .a придётся только пересобирать всех потребителей). Плюсов у них только чуть меньший оверхед на вызовы.

.la это вообще не библиотека, а костыль от костыля libtool, который решает описанную проблему с зависимостями. Т.е. если линковаться через libtool она может сама вытащить зависимости из .la файлов. От libtool лучше тоже держаться подальше, ибо это устаревший набор костылей.

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