2016-08-30 5 views
4

(Ubuntu 16.04.1)Clang ++ --gcc-набор инструменты и GCC 4.9.3, связывающие вопросов

По умолчанию на 16.04.1 лязге выбирают ССАГПЗ цепи инструмента для 5.4. К сожалению, у меня есть библиотека, которую требует: pre-5.0 ABI и У меня нет доступа к источнику, а разработчик не выпустил новую версию. Я пытался использовать параметр -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-инструментарий, лязг, кажется, принимает, то полностью игнорировать значение. (То же самое происходит с 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, удаление относительного пути и т. Д.) Я попробовал параметр -системы и параметр -cxx-isystem. (Оба предлагаются как решения аналогичных вопросов.)

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

+0

Вы нашли решение? Я также имею дело с очень похожей проблемой. – antosecret

+0

Мне нужно было заставить все работать FAST, поэтому я представил clang, пока мы не сможем получить все предметы под одним и тем же ABI. Я вернулся к GCC, пока не получаю возможность снова работать над проблемой цепочки инструментов. – ErnieE

ответ

0

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

0

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

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

Для переключения ABI перекрывая препроцессора макрос:

clang++ -D_GLIBCXX_USE_CXX11_ABI=0 

Таким образом, я бы рекомендовал вам построить набор инструментов вам нужно самостоятельно и передать префикс установки для --gcc-ToolChain вариант.

Если имеются настройки уже, вы можете обмануть лязг использовать выбранный набор инструменты, имитируя вашу/USR папки через симлинка, исключая ССАГПЗ версии вам не нужно.

0

Как писал Гаэтано в связанном билете, вам нужно создать отдельный каталог, который можно передать в 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