LINUX.ORG.RU

Вопросы по линкованию C-программ.


0

0

1) Откуда gcc берёт дефолтные пути до библиотек? (-L - пути). Я пишу -lasound и /usr/lib/libasound.* находятся, хотя -L/usr/lib я не пишу.
2) Если я написал -lzuzu, то достаточно ли наличия /usr/lib/libzuzu.so? Или как в винде - нужен ещё .a?
3) Какова логика выбора между .so и .a? Например у меня есть /usr/lib/libasound.a, /usr/lib/libadound.so - с какой будет идти линкование, если я пишу -lasound?

★☆

Последнее исправление: kiverattes (всего исправлений: 1)

Какова логика выбора между .so и .a?

динамическая линковка против статической

lazyklimm ★★★★★
()

похоже на то, что

1) «/usr/lib» - по умолчанию 2) зависит от флага -static к gcc 3) читать (2)

хотя я могу и ошибаться для Ъ - читать man gcc

metawishmaster ★★★★★
()
Ответ на: похоже на то, что от metawishmaster

Почитал man gcc немного, говорится что -lzuzu будет искать libzuzu.a.

1) -static распространяется на все упомянутые в командной строке библиотеки? Нельзя ли часть влинковать наглухо, а часть динамически?

2) Могут ли файлы .a содержать только оглавление (как .lib в винде, «таблицы импорта»), без самого кода, который бы лежал в .so?

kiverattes ★☆
() автор топика

Откуда gcc берёт дефолтные пути до библиотек?

В кланге они, помнится, были захардкожены. В gcc, ЕМНИП, их можно задать переменными окружения.

Если я написал -lzuzu, то достаточно ли наличия /usr/lib/libzuzu.so? Или как в винде - нужен ещё .a?

Достаточно.

Какова логика выбора между .so и .a? Например у меня есть /usr/lib/libasound.a, /usr/lib/libadound.so - с какой будет идти линкование, если я пишу -lasound?

Может сильно зависеть от связей между библиотеками, но по дефолту вроде статика.

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

Могут ли файлы .a содержать только оглавление (как .lib в винде, «таблицы импорта»), без самого кода, который бы лежал в .so?

В винде же есть *.dll.a

А в линуксе это, вероятно, не нужно.

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

ельзя ли часть влинковать наглухо, а часть динамически?

Я разрешаю.

cc -o test -lm lib.a test.c

.a - это архив с объектными файлами

Zorn
()

> 1) Откуда gcc берёт дефолтные пути до библиотек? (-L - пути). Я пишу -lasound и /usr/lib/libasound.* находятся, хотя -L/usr/lib я не пишу.

gcc -print-search-dirs
arsi ★★★★★
()

1) что-то общесистемное + LD_LIBRARY_PATH + pkgconfig сообщает
2) смотря как надо скомпилять: если динамически, то .so может быть и хватит (у меня, правда, не хватало: все равно нужен был .a)
3) статика/динамика

Eddy_Em ☆☆☆☆☆
()

man ld

я понимаю, что это неимоверно сложно, но всё же попытайся

anonymous
()

Какова логика выбора между .so и .a

Выбирается .so. Если нужно линковать именно с .a - нужно писать полный путь к .a: /usr/lib/libasound.a

Deleted
()

1. Стандартно из /lib /usr/lib или LD_LIBRARY_PATH если определен

2. Достатночно

3. Будет линковать с so. Если укзан флаг -static будет линковать с .a все библиотеки. Если нужно линковать одни библиотеки статически, а другие динамически, то перед статическими либами пишем -Wl,-Bstatic перед динамическими -Wl,-Bdynamic.

no-such-file ★★★★★
()
Ответ на: комментарий от gag

Да я уж и не помню: кажись, лептонику вручную собрал, только .so. Установил. Подсунул правильный pkgconfig'овский файл (который сам и написал, т.к. тогда еще лептоника какая-то сырая была). А фигвам: ругается, мол, библиотека не найдена.

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

Уверен, что дело было не в .so vs .a. Но так как проблема уже неактуальна, то это уже вопрос веры.

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

Возможно, проблема еще и в моей криворукости была.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

Если нужно линковать именно с .a - нужно писать полный путь к .a: /usr/lib/libasound.a

Необязательно

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