LINUX.ORG.RU

Travis CI и GNU Autotools: gcc vs clang

 , , ,


0

2

Всем здравствуйте.

А может ли кто-ниудь взглянуть на вот эти два вывода:

– и прокомментировать, какого рожна gcc (в отличие от clang) не смог слинковать при том, что все нужные зависимости были одинаково установлены?

На моей машине всё, ясен пень, успешно собирается.

Кто умеет в удалённую отладку Трэвиса? =)

Update: ИЧСХ, эквивалентная конфигурация GCC на GitLab успешно проходит.

★★★★★

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

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.

(c) man gcc

Попробуй переставить -lX11 в конец команды.

Deleted
()

Update: ИЧСХ, эквивалентная конфигурация GCC на GitLab успешно проходит.

На это поведение (имеет значение порядок или нет) вроде влияет опция ld «–as-needed». И, судя по нагугленному, в Ubuntu она добавляется по умолчанию. Но это не точно и требует проверки.

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

Спасибо =)

Но дело в том, что собираю-то я не вручную, и не колхозным скриптом, а через autotools. А там всё запихнуто в Makefile.am следующего содержания:

bin_PROGRAMS = dtwmcmd
dtwmcmd_SOURCES = dtwmcmd.c
dtwmcmd_LDFLAGS = @X_LIBS@ -lX11

Так что порядок, увы, не поменять.

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

Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o.

У меня-то как раз -lX11 foo.o, так что символы из библиотеки сам бог велел найти…

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

А вообще не похоже, что `@X_LIBS@` во что-то раскрывается.

А они и не должны. Это только на экзотических платформах. По умолчанию — только `-lX11`, но, в случае чего (SunOS/Tru64), стандартный макрос на m4 спасёт вашу шкуру =)

Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass
[im@im-mac src]$ gcc  -g -O2 -Wl,--as-needed -lX11  -o dtwmcmd dtwmcmd.o
/usr/bin/ld: dtwmcmd.o: in function `dtwmcmd':
/home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:64: undefined reference to `XInternAtom'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:65: undefined reference to `XGetWindowProperty'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:78: undefined reference to `XFree'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:88: undefined reference to `XInternAtom'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:89: undefined reference to `XGetWindowProperty'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:100: undefined reference to `XFree'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:105: undefined reference to `XInternAtom'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:106: undefined reference to `XChangeProperty'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:111: undefined reference to `XFlush'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:96: undefined reference to `XFree'
/usr/bin/ld: dtwmcmd.o: in function `main':
/home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:137: undefined reference to `XOpenDisplay'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:168: undefined reference to `XCloseDisplay'
/usr/bin/ld: /home/im/projects/patches/dtwmcmd/src/dtwmcmd.c:137: undefined reference to `XOpenDisplay'
collect2: error: ld returned 1 exit status


[im@im-mac src]$ gcc  -g -O2 -Wl,--as-needed  -o dtwmcmd dtwmcmd.o -lX11
[im@im-mac src]$ echo $?
0
Deleted
()
Ответ на: комментарий от xaizek
-dtwmcmd_LDFLAGS = @X_LIBS@ -lX11
+dtwmcmd_LDADD = @X_LIBS@ -lX11

Дружище, спасибо тебе огромное и плюсов в карму!

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

Таки да.

Как справедливо заметил xaizek, надо было заменить `LDFLAGS` на `LDADD`.

И всё взлетело.

Спасибо.

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

Если хочешь сборку, как на своей машине - сделай докеровский имидж своего дистра и на трависе собирай в докере. Опять же, если на до собрать под разные дистры - будет набор имиджей для этого.

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

Спасибо за мысль. В данном случае неактуально, но в перспективе сборки чего-то сложного с неопакеченными зависимостями — очень даже разумно.

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