Проблемы с связыванием Clang++ --gcc-toolchain и gcc 4.9.3

(Убунту 16.04.1)

По умолчанию в 16.04.1 clang выбирает цепочку инструментов gcc для 5.4. К сожалению, у меня есть библиотека, для которой требуется ABI до версии 5.0, и у меня НЕТ доступа к исходному коду, и разработчик не выпустил новую версию. Я пытался использовать параметр --gcc-toolchain, но НЕ могу заставить его работать. (ctrbegin.o и crtend.o не получают правильный префикс в ссылке.)

$ clang++-3.8 -v -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/6.0.0
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.3
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/6.0.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/6.0.0
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.3
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/5.4.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/6.0.0
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0
Candidate multilib: .;@m64
Selected multilib: .;@m64
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../x86_64-linux-gnu/bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../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/5.4.0/../../..:
/usr/lib/llvm-3.8/bin/../lib:
/lib:
/usr/lib

Когда я пытаюсь указать --gcc-toolchain, clang, кажется, принимает, а затем полностью игнорирует значение. (То же самое происходит с clang++-3.5 на 16.04.1.)

Это правильный синтаксис? Обратите внимание, что каталоги библиотек отсутствуют в выходных данных.

$ clang++-3.8 -v --gcc-toolchain=/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.3 -print-search-dirs

clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
programs: =/usr/bin:/usr/lib/llvm-3.8/bin:/..//bin

libraries: =/usr/lib/llvm-3.8/bin/../lib/clang/3.8.0:/lib/x86_64-linux-gnu:/lib/../lib64:/usr/lib/x86_64-linux-gnu:/usr/lib/llvm-3.8/bin/../lib:/lib:/usr/lib

Я пробовал МНОГИЕ вариации на вышеуказанную тему. (4.9, удаление относительного пути и т. д.) Я пробовал параметр -isystem и параметр -cxx-isystem. (Оба предложены как решения схожих проблем.)

Что я упускаю? (Надеюсь, это просто, и хлопнуть головой в порядке!)


person ErnieE    schedule 30.08.2016    source источник
comment
Вы нашли решение? Я тоже занимаюсь очень похожей проблемой.   -  person antosecret    schedule 27.11.2016
comment
Мне нужно было заставить все работать БЫСТРО, поэтому я поставил на стол clang, пока мы не сможем получить все предметы под одним ABI. На данный момент я вернулся к GCC, пока у меня не будет возможности снова поработать над проблемой цепочки инструментов.   -  person ErnieE    schedule 06.12.2016


Ответы (3)


Кажется, вы указываете неверный путь к опции --gcc-toolchain. Он ожидает путь к префиксу установки GCC, который равен /usr в случае, если GCC установлен с менеджером пакетов. Однако я не думаю, что можно выбрать, какую цепочку инструментов использовать, если в вашей системе установлено несколько версий GCC, и все они имеют одинаковый префикс. Похоже, clang просто берет последнюю версию из каталога $PREFIX/lib/gcc/x86_64-linux-gnu. Итак, я бы порекомендовал вам собрать необходимый набор инструментов самостоятельно и передать префикс установки в параметр --gcc-toolchain.

person Nikolai    schedule 06.12.2016
comment
Большое спасибо, просто потратил часы, пытаясь решить это. Сейчас это более серьезная проблема, чем раньше, так как более старые версии Clang не будут связываться с более новыми версиями gcc, что в конечном итоге приведет к нарушению сборки clang, если установлена ​​более новая версия gcc. И обходной путь практически невозможно найти без таких ответов. - person Contango; 07.05.2020

К сожалению, у меня есть библиотека, для которой требуется ABI версии до 5.0, и у меня НЕТ доступа к исходному коду.

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

Чтобы переключить ABI, переопределяющий макрос препроцессора:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

Итак, я бы порекомендовал вам собрать необходимый набор инструментов самостоятельно и передать префикс установки в параметр --gcc-toolchain.

Если он уже доступен, вы можете обмануть clang, чтобы использовать выбранную вами цепочку инструментов, имитируя вашу папку / usr через символические ссылки, исключая версии gcc, которые вам не нужны.

person Gaetano    schedule 01.02.2017

Как написал Гаэтано в связанном тикете, вам нужно создать отдельный каталог, который можно передать в clang как --gcc-toolchain. Вот мой слегка усовершенствованный код. Ссылки bin и include не нужны.

# The libstdc++ version you want to use
libstdcxx_version="4.9"
# Avoid calling arch twice
arch="$(arch)"
# The new toolchain root in the current directory
toolchain_root="$(pwd)/toolchain"
# The gcc library directory to be created
toolchain_gcc="$toolchain_root/lib/gcc/$arch-linux-gnu"
# Create that directory
mkdir -p "$toolchain_gcc"
# Find the longest matching libstdc++ version.
# Needed for clang-3.8 and older - they need 4.9.x rather than 4.9.
libstdcxx_dir=$(ls -d /usr/lib/gcc/$arch-linux-gnu/${libstdcxx_version}* \
  | tail -1)
# Link the libstdc++ library directory to the new location
ln -sfn "$libstdcxx_dir" "$toolchain_gcc/"
# Now you can add "--gcc-toolchain=$toolchain_root" to the clang flags
person proski    schedule 23.02.2018