LINUX.ORG.RU

Пытаюсь разобраться

 ,


1

1

Привет. Пытаюсь осилить. Сделал для теста следующее:

  1. В /usr/local/ установил либу (libmy.la, libmy.so*)
  2. Сделал другой тестовый проект
#configure.ac
LT_INIT([disable-shared])

#Makefile.am
bin_PROGRAMS = main
main_SOURCES = main.cc
main_LDADD = -lmy

Собираю исполняемый файл. Ожидаю, что он слинкуется с libmy.a. Проверяю

readelf -a main | less
Dynamic section at offset 0x2db0 contains 30 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libmy.so.0]

Вопрос: почему линкуется с so?
Кстати, почему-то не работает ldconfig -n /usr/local/lib, кеш не обновляется, работает лишь голый ldconfig, почему? В /etc/ld.so.conf

/usr/local/lib
/usr/local/lib64
★★

почему линкуется с so?

Умолчания видимо - gcc с so линкует без особых указаний. Посмотри команду на компоновку и всё поймёшь(ну кроме того, что тебе нужен не autotools, а cmake)

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

Так там линковка через libtool завязана, команда

libtool: link: g++ -std=c++17 -Wall -Wextra -Wshadow -pipe -O2 -DNDEBUG -o main main.o  -lmy

хз чего там у libtool’a на уме

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

Я тоже от него не в восторге. Как вы линкуете so либы? Ну можно самому давать флаги вроде -fPIC -shared. Но хз, не уверен (переосимость и всё такое).

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

тебе нужен не autotools, а cmake

что бы получить ещё большую абстракцию над компилятором. А чем autotools плох? Не осиливается такой синтаксис

AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile
		src/Makefile
		src/tests/Makefile
		src/ee/Makefile])

Вот libtool, какой-то нехороший костыль …

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

Хм, точно, я и забыл уже. Короч, бери cmake и не парься(там хотя бы вызов компилятора и линкера можно увидеть)

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

ещё большую абстракцию над компилятором

На самом деле такую же. autotools тоже генерит скрипт для бэкенда(make, больше оно ни во что не умеет, емнип)

А чем autotools плох?

Под виндой не работает. Щас набегут свидетели cygwin-а и msys, но это работа в cygwin и msys, а не в винде. Ну и дока у cmake лучше

anonymous
()

Кастуй Harald, он всё время за этот кошмар топит. Вдруг он в нем еще и разбирается.

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

Да не, это значительно более абстрактная ерунда. Вот хочу я какие-то отладочные флаги для компилятора, это в принципе не кроссплатформенно. А для автотулзов накостылил

cxx_flags="-O2 -DNDEBUG"
AC_ARG_ENABLE(debug,
		AS_HELP_STRING([--enable-debug], [enable debugging, default: no]),
		[case "${enableval}" in
			yes) cxx_flags="-O0 -ggdb3 -D_GLIBCXX_ASSERTIONS";;
			no)  ;;
			*)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
		esac])
CXXFLAGS=${CXXFLAGS=${cxx_flags}}

Так что знаете, вертел я эту всякую винду. Костылить потом в этом cmake под каждый компилятор.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick
set(OPTS -O2 -DNDEBUG)
if (CMAKE_BUILD_TYPE STREQUAL Debug)
  set(OPTS -O0 -ggdb3 -D_GLIBCXX_ASSERTIONS)
endif ()
target_compile_options(ururu PRIVATE ${OPTS})

В чём разница? Хардкод флагов везде можно

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

всё на месте

$ ls /usr/local/lib/libmy*
/usr/local/lib/libmy.a  /usr/local/lib/libmy.la  /usr/local/lib/libmy.so  /usr/local/lib/libmy.so.0  /usr/local/lib/libmy.so.0.0.0
pavlick ★★
() автор топика
Ответ на: комментарий от anonymous

В чём разница? Хардкод флагов везде можно

Ну и какой смысл передавать такие флаги MSVC? Надо кучу if’ов … . А autotools это однообразная среда, простый шелл синтаксис. Если очень хочется винду, то мингв.

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

Кстати, о cmake: это я не разобрался, или в ней нет адекватного способа посмотреть (удобно, подобно configure –help) опции проекта? Как-то ковырял кеш, юзал какие-то костыли через awk для тривиальнейшей задачи.

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

autotools это однообразная среда

… в которой не

Надо кучу if’ов

Под виндой же всё равно не работает, что с if, что без )

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

Вообще об этом не задумываюсь, всё делает CMake.

+++

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

)) О, спасибо. Надо запомнить, а то каждая встреча с cmake проектам превращалась в увлекательный квест. Хз, может недавно вкрутили, но awk’ный костыль находил где-то стековерфлоу.

pavlick ★★
() автор топика

Въехал. disable-shared немного о другом (управляет тем, что либтул создаёт на выходе). Тут же другой случай, если хочу линковать со статик, то либо писать полный путь к .a архиву, либо так

ain_LDADD = -lmy
main_LDFLAGS = -all-static

а если не передал флаг -all-static, то либтул будет линковать с либой (статик/со) на своё усмотрение в зависимости от возможностей системы. В общем-то обычное поведение, которое сохраняется и при сносе .la.

Зачем тогда la? Кто-нибудь знает? Есть предположение - такой способ сохранить зависимости для статических архивов (вроде pkg-config -static), которые зашиты в ELF, но отсутствуют в .a.

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

И ещё вопрос - существуют ли на сегодняшний системы (на которых можно autotools) в значимом количестве, которые не умеют разделяемый библиотеки? Т.е. может вообще не заморачиваться и клепать либы через -shared -fPIC?

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

Зачем тогда la? Кто-нибудь знает? Есть предположение - такой способ сохранить зависимости для статических архивов (вроде pkg-config -static), которые зашиты в ELF, но отсутствуют в .a.

Оказывается, что можно встретиться со случаем, когда в динамических модулях собранных для dlopen() отсутствует информация о зависимостях (если не врут, то macos). Тут также используется .la через libtool libltdl. Может не такой уж и бесполезный костыль этот libtool, ну как писать какую-нибудь модульную софтину со сторонними программистами, которые будут давать свои модули? Линковать испольняемый файл со всем миром на всякий случай? Ну или писать свои костыли, которые превратятся в ещё один Libltdl с lib_мой_костыль.la.

pavlick ★★
() автор топика

disable-shared делает автотулзы собирать только статические библиотеки (т.е. те, которые собираются из исходников данного проекта), на линковку со сторонними библиотеками оно не влияет, нужно флагами линкера задавать

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

О линковке с la. После чтения доков/экспериментов пришёл к следующему: когда линковаться с la в _LDADD?

  1. Хотим линковаться с либой статической + со всеми зависимостями, который сохраняются в la. Т.е. всякие pkg-config не устраивают (флаги -static, -all-static).
  2. Слинкованная разделяемая либа часть проекта, который также содержит исполняемый файл линкуемый с этой либой. Тогда libtool создаст обёртку вместо бинаря, которая позволит запускать его (для теста) без установки либы в …/lib (через LD_PRELOAD, наверное).

Во всех иных случаях можно спокойно линковаться -lmy.

ЗЫ: всем спасибо, вроде libtool осилил.

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

Хотим линковаться с либой статической + со всеми зависимостями, который сохраняются в la. Т.е. всякие pkg-config не устраивают (флаги -static, -all-static).

Кстати, для .so’шек это тоже работает. Если либа lib1 слинкована с либой lib2, то линковка в стиле

gcc main.c lib1.so

не сделает main зависимым от lib2 (ld.so автоматом не загузит). Линковка с .la - сделает. Заргузка же модуля lib1 через dlopen подгрузит lib2 (не везде, для этого костылили lt_dlopen)

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

Лучше расскажи - как божественный cmake решает проблему зависимостей загружаемых модулей через dlopen на системах, где загрузчик их подгружать не будет?

pavlick ★★
() автор топика

Вопрос: почему когда libtool получает команду

libtool: link: g++ -O2 -DNDEBUG -o main main.o  -lmy

он не пытается слинковаться с libmy.la? Нужно передавать абсолютный путь /usr/local/lib/libmy.la. Может не понял идеи, но в чём смысл? Сделал я тесты через AC_CHECK_LIB, в LIBS набролось куча -lname, но libtool даже не пытается слинковать со своими же либами. А указывать абсолютный путь, ну как-то ненадёжно. Зачем так, может есть какой флаг, который изменит поведение (линковать с libmy.la при встрече -lmy)?

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

Щас набегут свидетели cygwin-а и msys

Я как свидетель и cygwin, и msys2, скажу что лучше не надо это использовать. Каждый раз, когда в Conan под винду нужно упаковать что-то собираемое при помощи autotools плотность мата на единицу объема рядом с моим компом опасно повышается.

ТС, действительно, используй CMake. Он и кроссплатформенный, и мейнстрим (что означает, что большую часть подводных камней до тебя нашли).

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

Под виндой не работает. Щас набегут свидетели cygwin-а и msys, но это работа в cygwin и msys, а не в винде. Ну и дока у cmake лучше

Лучше всего собирать кросс-компилятором из под линукса, на порядки быстрее, чем в винде под cygwin-ом

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

Написал по этому вопросу в libtool mailing list. Последний вопрос-ответ там не сохранился (может как-то криво отправли), вот они:

Thank you for reply.

Since you mention /usr/local/lib, can you confirm that LDFLAGS includes -L/usr/local/lib or that this argument was otherwise supplied to libtool?

No, I did not use the -L flag. When passing to libtool -L /usr/local/lib, the executable is linked to libmy.la (it is ok).

I think that libtool attempts to deduce the compiler’s default linking path so that it does not duplicate the default. However, the compiler’s default linking path might not match what is used by the operating system.

By «know in advance», do you mean that as a software developer you can’t know the configuration of some other system while building, …

Yes, I use atotools+libtool. As a developer, how can I discover library paths of end user which will build my package? For example, he has installed libraries in $HOME/lib, has set appropriate LIBRARY_PATH and has edited /etc/ld.so.conf so that they point to $HOME/lib. But libtool will not know about this and will not find those libraries. I thought libtool should somehow synchronize path information with linkers.

What is the right way when linking? Assigning most probable paths (/lib, /usr/lib, /usr/local/lib) with -L? $ libtool–mode=link g++ -L/lib -L/usr/lib -L/usr/local/lib … And if end user violates standard layout then this is his problem.

This is indeed a problem and likely not one with a perfect solution. Libtool is just a script. It asks GCC what paths it will use while linking. Sometimes GCC does not tell the truth.

Linux (I am assuming you are using Linux since you did not say) may use a different path based on the ldconfig configuration, which may be changed by the system administrator.

An important consideration is that a library may be installed multiple times. For example, I may install an updated/fixed version of a library in /usr/local/lib and I want my updated/fixed version to be used rather than the version installed by the OS’s package manager. In this case I would prefer that the directory path be in the opposite order you suggested. In this case, I might also want to use ldconfig to change the library search order, or perhaps I might hard-code the library run-path so that this is not necessary.

The golden rule should be that if the user specifies LDFLAGS to the configure script, that the linker search path specified there should always be given priority over defaults. This allows the user to take remedial action if the built-in assumptions are not correct.

If the user is doing something out of the ordinary (developers often do that!), then s/he should be able to influence the build process so search the correct directories for libraries and install to the correct location. The standard environment variables and arguments for influencing the build are provided by the standard INSTALL file.

Bob
Bob Friesenhahn

=======================================================

Хз, для меня так и осталось тайной - почему libtool не синхронизирует пути поиска lib с ld …

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

Насколько должно быть нечего делать, чтобы подобным заниматься. Дропнул autotools и всё

anonymous
()

Использованаие libtool’ом тех же путей что и линкером:

#configure.ac
[ld_paths=$(${LD} --verbose | grep SEARCH_DIR | sed 's/); *SEARCH_DIR(/ -L/g; s/SEARCH_DIR(/ -L/; s/);//')]
AC_SUBST(ld_paths)

Makefile.am
main_LDFLAGS = $(ld_paths) 

Правда там что-то ещё компилятор добавляет, но несущественно, у меня выхлоп такой:

-L"/usr/x86_64-pc-linux-gnu/lib64" -L"/usr/lib" -L"/usr/local/lib" -L"/usr/x86_64-pc-linux-gnu/lib"

Тут много auto хейтеров, как я погляжу. Ребят libtool это необязательно, можно не писать макрос LT_INIT и его вообще не будет. Просто инструмент такой есть, нужно как-то его понимать.

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

Просто инструмент такой есть, нужно как-то его понимать.

А другие инструменты ты уже понимаешь? Meson там или Cmake? Осталось только autotools для коллекции? Если нет, то почему сперва выбрал изучить autotools?

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

Потому что это классическое, проверенное временем универсальное кроссплатформенное решение. В отличие от новомодной хипстоты

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

Когда-то пробовал Cmake, но чего-то не проникся.

почему сперва выбрал изучить autotools?

)) А почему нет? Он прост, логичен, без лишних абстраций (не считая libtool), почему он должен меня не устраивать? И никто не запрещает кросскомпиляцию под винду на Линуксе. Cmake прост для типового hellow world, а что если мы хотим отключить strict aliasing оптимизацию, например? Божественный Cmake должен накинуть ещё один слой абстракции реализующий опции под каждый компилятор ). Вот вообще не охота связывать себе как-то руки из-за этой недоОС. Пусть винда становится Unix like, и тогда сможет спокойно собирать софт, а пока пусть страдают.

pavlick ★★
() автор топика

В configure.ac LT_INIT тебе не нужен. Достаточно прописать в Makefile.am main_LDADD = libmy.a

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