Você pode usar --sysroot=/usr/arm-linux-gnueabihf/sys-root
neste caso. O Clang, a partir do 6.0 (ATM não-liberado), parece contornar as inúmeras maneiras pelas quais as bibliotecas e ferramentas GNU (gcc, glibc e libstdc ++ em particular) são dispostas nas distribuições Linux. Você ainda pode ter alguns problemas, que é onde usar
clang -v ...
bem como
strace -e 'trace=!write' clang ...
para ver os diretórios que o Clang está procurando ajudará. Eu encontrei uma solução hacky no Fedora. Eu estou fazendo atualmente:
(Estou usando o gcc 7 e clang aqui, e <sysroot>=/usr/arm-linux-gnueabihf/sys-root
)
-
Instale os pré-requisitos de compilação cruzada (varia de acordo com a distribuição, mas o Fedora tem um pacote de sistema de arquivos que cria a pasta <sysroot>
). Isso também inclui todos os binários e cabeçalhos de desenvolvimento para sua plataforma de destino. Infelizmente, não há ótimas soluções prontas para isso em muitas plataformas. Por exemplo, o Fedora não possui libstdc++
para o aarch64, mas o IIRC Debian e o Ubuntu têm isso.
-
Crie um sysroot para a plataforma
mkdir -p <sysroot>/lib/gcc
ln -s <sysroot>/include <sysroot>/usr/include # Another Clang quirk, it seems
-
Copie os binários do GCC e os cabeçalhos do libstdc ++. Isso é um pouco frustrante, pois a forma como a Clang procura as instalações do GCC é pesquisando caminhos comuns ( por exemplo, , /usr/lib/gcc/x86_64-linux-gnu
) e indo até um número X de diretórios para encontrar cabeçalhos associados. Isso significa que, a menos que você possa criar hard links de seus binários gcc para sua nova raiz de sistema, você precisará copiar os binários e (alguns) cabeçalhos. Isso é o que eu tive que fazer para que isso funcionasse (pode ser diferente para você):
cp -r /usr/lib/gcc/arm-linux-gnueabihf/ <sysroot>/lib/gcc
# Fedora installs C++ headers here, but we will copy them into sys-root
# Copy all of your other headers in the same manner
cp -r /usr/arm-linux-gnueabihf/include/c++ <sysroot>/include
-
Adicione o sinalizador --sysroot=
para clangar
clang --target=arm-linux-gnueabihf --sysroot=<sysroot> ...
A maior parte da lógica do Clang que lida com a busca por esses diretórios parece estar dentro desses arquivos (eles podem não existir em versões mais antigas do Clang):
lib / Driver / Tags de ferramentas / Gnu.cpp
lib / Driver / Chaves de ferramentas / Linux.cpp