LINUX.ORG.RU

Как рассказать clang'у, где у меня GCC installation?

 


0

1

Собираю игру про космического снайпера-кастрата летуна от cvs-255. Там в мейкфайле в качестве компилятора жёстко прописан clang. Ну я и думаю: попробую шлангом собрать.

clang не может найти некоторые стандартные заголовки при -stdlib=libstdc++, а кроме того, не может сказать линкеру ничего толкового на стадии линковки. Вот вывод -print-search-dirs:

$ clang -v -print-search-dirs     
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.8.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
programs: =/usr/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/bin
libraries: =/usr/bin/../lib/clang/3.4:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../..:/lib:/usr/lib
Ну так всё понятно: от всего GCC 4.9 у меня только gccgo. Надо пользоваться gcc 4.8.

Как сказать clang'у, чтобы он пользовался 4.8, несмотря на наличие 4.9?

★★★★★

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

У тебя всего скорее gcc-4.9 был установлен по умолчанию? Смотри на утилиту update-alternatives чтобы заменить на 4.8. Ну да придется постоянно менять ради gccgo и clang.

bhfq ★★★★★
()
$ gcc-config
Usage: gcc-config [options] [CC Profile]
Change the current compiler profile, or give info about profiles.

Options:
  -C, --nocolor              Disable color output
  -O, --use-old              Use the old profile if one was selected.
  -f, --force                Make sure all config files are regenerated.
  -c, --get-current-profile  Print current used gcc profile.
  -l, --list-profiles        Print a list of available profiles.
  -S, --split-profile        Split profiles into their components
  -E, --print-environ        Print environment that can be used to setup the
                             current gcc profile, or a specified one.
  -B, --get-bin-path         Print path where binaries of the given/current
                             profile are located.
  -L, --get-lib-path         Print path where libraries of the given/current
                             profile are located.

Profile names are of the form:  <CTARGET>-<version>
For example:                    i686-pc-linux-gnu-3.2.1
$ gcc-config -c
x86_64-pc-linux-gnu-4.8.3
$ gcc-config -l
 [1] x86_64-pc-linux-gnu-4.8.3 *

Оно?

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

У тебя всего скорее gcc-4.9 был установлен по умолчанию? Смотри на утилиту update-alternatives

Так нет же, вроде бы:

$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ update-alternatives --display gcc
update-alternatives: error: no alternatives for gcc
Я раньше с clang не имел дела, поэтому могу только предположить, что он ищет GCC в директориях из какого-то в худшем случае захардкоженного, в лучшем — зарытого в конфигурации списка.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

А ты точно не поменял clang++ на clang?

В данный момент шапка мейкфайла выглядит так:

OF=character.o  data_structures.o  draw.o  enemy.o  init.o  life_bonus.o  main.o  menu.o  passive.o  ship.o wall.o
HF=data_structures.h  draw.h  init.h  menu.h  ship.h wall.h

INC=/usr/include/SDL2/
LD=-L/usr/lib/x86_64-linux-gnu/ -lpng -lSDL2 -lSDL2_ttf

CXX=clang++ -stdlib=libstdc++ -I/usr/include/c++/4.8 -I/usr/include/x86_64-linux-gnu/c++/4.8 -I$(INC) -g

OUT=rt4lin
Я добавил -stdlib=libstdc++, поскольку она у меня установлена, а libc++ — нет. Хотя, впрочем, я вижу, что она в репах есть, могу её попробовать. Далее идут мои попытки рассказать clang'у, где лежат файлы. Но они не увенчались успехом, потому что ld говорит: -lstdc++ не найдено. Есть файл /usr/lib/x86_64-linux-gnu/libstdc++.so.6, но я так понимаю, что нужны либо манипуляции с soname, либо по-человечески сказать clang'у, что GCC 4.9 у меня нет.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Пожалуйся на автора в разделе жалоб и предложений. Потребуй, чтобы можно было собирать и GCC.

Если поменять clang++ на g++, то всё работает.

Но на будущее хотелось бы узнать.

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

Если поменять clang++ на g++, то всё работает.

...только segmentation fault через некоторое время.

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

А ты вообще что-нибудь можешь скомпилировать с помощью clang++ или это только в этом примере не работает?

Я clang ставил apt-get install clang. После этого все заработало.

cvs-255 ★★★★★
()
Ответ на: комментарий от i-rinat

Я прочитал ту дискуссию, и, насколько я понял, там ответа нет. :-( Началось всё с вопроса «как выбрать вручную без эвристики», а кончилось «вот патч для эвристики, чтобы в данном конкретном случае не надо было выбирать вручную».

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

А ты вообще что-нибудь можешь скомпилировать с помощью clang++ или это только в этом примере не работает?

Нет, даже хэллоуворлд на C++ не компилируется.

Я clang ставил apt-get install clang. После этого все заработало.

Ну теперь сделай apt-get install gccgo-4.9 , и, как в анекдоте про «А у нас зато Горбачёв есть», у тебя всё перестанет компилироваться.

Если серьёзно, я сейчас попытался снести gcc-4.9, но он почему-то не сносится теперь, почему-то от него зависят ещё пакеты. Я так понимаю, у меня может быть что-то серьёзно поломано в пакетах.

Что, впрочем, никак не меняет ситуации с тем, что clang ищет gcc, где хочет, и никого не слушает.

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

там hardcoded, до сих пор
файл tools/clang/lib/Driver/ToolChains.cpp

Ну что же, ясно, спасибо.

Это, конечно, как говорили крокодил Гена и пионерка Галя, совсем не здорово и даже очень глупо.

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

поставь

Ты знаешь, при ближайшем рассмотрении оказалось, что он стоит практически весь. Только он как-то странно собран. Файл /usr/bin/gcc-4.9 находится в пакете gccgo. «gcc -v» показывает, что он только и поддерживает C, C++ и Go. Хэллоуворлд на чистом C он собрать не может. g++-4.9 вообще нет.

Поэтому тут как-то очень всё экспериментально сделано с этим GCC 4.9. Он только в Ubuntu 14.10 будет основным компилятором.

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

а давай сразу rm -rf /* ?

Это я просто насчёт того прокомментировал, что и у меня бы всё работало, если бы пакеты друг друга не ломали.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Ну вот, поставил более-менее нормальный gcc-4.9 из ppa:ubuntu-toolchain-r/test . Теперь установился полноценный GCC 4.9, и Clang всё собирает.

Очень это удобно в Clang'е сделано, что без правильной версии другого компилятора ничего не работает...

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

ну вообще-то это не совсем так,
clang просто нужны libstdc++ заголовки и
вот это

$ ls /usr/local/llvm/gcclibs/
crtbegin.o crtbeginT.o crtendS.o crti.o crtprec32.o crtprec80.o libgcc.a libgcc_s.so.1 Scrt1.o
crt1.o crtbeginS.o crtend.o crtfastmath.o crtn.o crtprec64.o gcrt1.o libgcc_s.so Mcrt1.o

сам gcc ему не нужен

Sylvia ★★★★★
()

Собирай с libc++.

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

clang просто нужны libstdc++ заголовки и
вот это

Ну, это я несколько преувеличиваю, потому что обувь сапожника привлекает повышенное внимание.

Надо будет попробовать libc++ и compiler-rt.

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

Очень это удобно в Clang'е сделано, что без правильной версии другого компилятора ничего не работает...

На самом деле, да. И так напрягаться, чтоб код писать, ещё и компилятор конфигурировать? Лучше чтобы оно само нашло то, что ему надо. В большинстве случаев это работает, по ссылке проблемы выползли только при кросс-компиляции. Да и у тебя не самая распространённая ситуация.

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

Еще у clang есть опция --gcc-toolchain

Где?

$ clang --gcc-toolchain
clang: error: unsupported option '--gcc-toolchain'
clang: error: no input files
Или в какой-то очень новой версии?

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

У тебя какой clang? Опция очень давно поддерживается.

clang --version
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix

Насколько я понимаю, 3.4 — это последняя стабильная ветка. Или она в 3.5 появилась?

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

В 3.4 должно работать. clang --gcc-toolchain=/path/to/gcc/root

А! Я понял, в чём беда. Спасибо, сам бы не нашёл.

Такая опция вправду есть, только её в man'е нету. Но если набрать clang --help, то там есть, да. Но если просто набрать «clang --gcc-toolchain», то он говорит, что опция неизвестна, вместо того, чтобы сказать, что нужен аргумент.

Только она как-то очень странно работает:

$ clang -print-search-dirs 
programs: =/usr/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../x86_64-linux-gnu/bin
libraries: =/usr/bin/../lib/clang/3.4:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../..:/lib:/usr/lib

$ clang --gcc-toolchain=/usr/lib/gcc/x86_64-linux-gnu/4.8 -print-search-dirs
programs: =/usr/bin:/..//bin
libraries: =/usr/bin/../lib/clang/3.4:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/lib:/usr/lib
Все библиотеки лежат прямо в /usr/lib/gcc/x86_64-linux-gnu/4.8 . А он их где искать собрался? Может, я неправильный путь указываю?

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

Врет, скорее всего. Попробуй с -v, и посмотри, где конкретно он берет libgcc и прочую хрень. От gas можно отвязаться на x86, используя встроенный ассемблер. Линковать лучше всего gold-ом.

В принципе можно целиком отвязать clang от gcc: собрать libc++ и libc++abi, собрать выдранные из gcc crtbegin и т.д.

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

Вот что происходит при компиляции хэллоуворлда:

$ clang++ -v --gcc-toolchain=/usr/lib/gcc/x86_64-linux-gnu/4.8 hello.cc
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Selected GCC installation: 
 "/usr/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name hello.cc -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-linker-version 2.24 -v -resource-dir /usr/bin/../lib/clang/3.4 -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/clang/3.4/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/fedor/test -ferror-limit 19 -fmessage-length 80 -mstackrealign -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o /tmp/hello-7a5cb0.o -x c++ hello.cc
clang -cc1 version 3.4 based upon LLVM 3.4 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/bin/../lib/clang/3.4/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
hello.cc:2:10: fatal error: 'iostream' file not found
#include <iostream>
         ^
1 error generated.
Очевидно, что, увы, не врёт. Ничего не находит.

Может быть, я не ту директорию указываю в качестве gcc root? Вот что лежит в /usr/lib/gcc/x86_64-linux-gnu/4.8:

$ ls /usr/lib/gcc/x86_64-linux-gnu/4.8
32	       include		  libgcov.a		  libobjc.so
cc1	       include-fixed	  libgomp.a		  libquadmath.a
cc1plus        libasan.a	  libgomp.so		  libquadmath.so
collect2       libasan_preinit.o  libgomp.spec		  libssp_nonshared.a
crtbegin.o     libasan.so	  libitm.a		  libstdc++.a
crtbeginS.o    libatomic.a	  libitm.so		  libstdc++.so
crtbeginT.o    libatomic.so	  libitm.spec		  libsupc++.a
crtend.o       libbacktrace.a	  liblto_plugin.so	  libtsan.a
crtendS.o      libgcc.a		  liblto_plugin.so.0	  libtsan.so
crtfastmath.o  libgcc_eh.a	  liblto_plugin.so.0.0.0  lto1
crtprec32.o    libgcc_s_32.so	  libobjc.a		  lto-wrapper
crtprec64.o    libgcc_s.so	  libobjc_gc.a		  x32
crtprec80.o    libgcc_s_x32.so	  libobjc_gc.so
Гуглёж не дает результатов, греп по исходникам llvm-toolchain не дал результатов. Если ты замечаешь, что я делаю не так, то скажи, буду очень благодарен. А если нет, то я даже не знаю... придётся, наверное, читать эти исходники внимательно...

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

что-то я не понимаю, хваленный проприетащикоугодный clang настолько полноценный что без gcc не работает ? объясните что тут происходит-то!

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

без gcc не работает

Работает. Но обычно его собирают так, чтобы он с gcc взаимодействовал. ТС явно брал clang из пакетов, а не собирал, как полагается.

От gcc ему нужна libgcc (crtbegin, crtend и прочая гадость). Он так же умеет использовать libstdc++, которая идет в составе gcc, но можно и libc++.

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

Странный вообще у тебя gcc. Обычно --gcc-toolchain работает корректно, если ему дать prefix, куда устанавливался gcc. У тебя же он по системе размазан.

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

Странный вообще у тебя gcc.

Из репозиториев Убунты.

Обычно --gcc-toolchain работает корректно, если ему дать prefix, куда устанавливался gcc. У тебя же он по системе размазан.

/usr?

У меня есть самосборный GCC, правда для --host=i686-pc-linux-gnu (а у меня amd64). Я пробовал, кстати, его подсунуть clang'у, не помогло: он как будто проигнорировал --gcc-toolchain. Однако у него в иерархии файлов всё то же самое: ~/Builds/gcc-i686/lib/i686-pc-linux-gnu/gcc/4.8.2 — то есть, похоже, GCC в пакетах Убунты запакован так, как он сам устанавливается, если --prefix=/usr.

Работает. Но обычно его собирают так, чтобы он с gcc взаимодействовал. ТС явно брал clang из пакетов, а не собирал, как полагается.

Попробую потом пособирать. Вижу, кстати, что при сборке тоже можно указать --with-gcc-toolchain. Может, он таким образом найдёт правильный GCC. Или, может быть, в Убунте что-то напутали с пакетом.

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