#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.