Проблема с привязкой X11, потенциально связанная с musl libc

#makefile #x11 #musl

#makefile #x11 #musl

Вопрос:

Я запускаю Alpine Linux с musl libc, пытаясь установить-
https://github.com/patrickhaller/no-wm/
с-
make install
У меня установлены musl-dev и libx11-dev.
libx11-dev помещает библиотеки в /usr/lib, а не в /usr/X11/lib. см-
https://pkgs.alpinelinux.org/contents?branch=edgeamp;name=libx11-devamp;arch=x86amp;repo=main
Поэтому я изменил строку Makefile на-
X11LIB = -lX11 -L/usr/lib/
Я подтвердил libX11.so находится в этом расположении каталога.

Тем не менее, моя установка по-прежнему завершается неудачей с этим выводом-

 $ make install
gcc -O2 -Wall -std=c99 -pedantic -lX11 -L/usr/lib/ x-alt-tab-mru.c -o x-alt-tab-mru
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/cckobJdo.o: in function `x_alt_tab':
x-alt-tab-mru.c:(.text 0x70): undefined reference to `XGetWMHints'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0x84): undefined reference to `XGetWindowAttributes'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0xec): undefined reference to `XLowerWindow'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0xf8): undefined reference to `XRaiseWindow'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0x10c): undefined reference to `XSetInputFocus'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0x11c): undefined reference to `XRestackWindows'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text 0x128): undefined reference to `XSync'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/cckobJdo.o: in function `main':
x-alt-tab-mru.c:(.text.startup 0x34): undefined reference to `XOpenDisplay'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text.startup 0x44): undefined reference to `XSync'
/usr/lib/gcc/aarch64-alpine-linux-musl/10.2.0/../../../../aarch64-alpine-linux-musl/bin/ld: x-alt-tab-mru.c:(.text.startup 0x70): undefined reference to `XQueryTree'
collect2: error: ld returned 1 exit status
make: *** [Makefile:19: x-alt-tab-mru] Error 1
  

Я подтвердил, что заголовки в этом файле x-alt-tab-mru.c присутствуют в правильном месте и были включены в libx11-dev.

Что я могу сделать дальше, чтобы устранить неполадки и заставить его скомпилировать? Я проверил все, что мог придумать..

Комментарии:

1. Порядок аргументов команды link имеет большое значение. В маловероятном случае, которого /usr/lib нет в пути поиска компоновщика по умолчанию, соответствующий -L параметр должен появиться перед -l параметрами, ссылающимися на библиотеки, которые там находятся: X11LIB = -L/usr/lib -lX11 . Но если бы проблема заключалась в том, что libX11 не был найден, тогда компилятор сообщил бы об этом , чего он не делает.

2. Проблема, скорее всего, связана с другим порядком аргументов: в командной строке link -l параметр для данной библиотеки Z должен идти после имен исходных файлов, объектных файлов и других библиотек, которые ссылаются на функции, предоставляемые Z .

3. Фантастика! Если вы хотите отправить это в качестве ответа, я бы принял его, если мне это разрешено. Ваш второй комментарий был именно проблемой. Спасибо @JohnBollinger

Ответ №1:

Порядок аргументов в командной строке ссылки имеет большое значение. -L параметры применяются только к поиску библиотек, назначенных позже в командной строке, и, по крайней мере, для статического связывания, неопределенные символы в одном объекте из тех, которые связываются, разрешаются только по отношению к другим объектам, назначенным позже в командной строке. Поведение может (или не может) немного отличаться при связывании общих библиотек, но для обеспечения безопасности вы всегда должны упорядочивать объекты, которые будут связаны (исходные файлы, объектные файлы и библиотеки), в соответствии с их зависимостями.

В частности, тогда,

  • в маловероятном случае, который вам -L/usr/lib вообще нужен, это должно произойти раньше -lX11 , и
  • -lX11 опция должна появиться после x-alt-tab-mru.c в команде link.