Я пытаюсь выполнить кросс-компиляцию в AArch64, используя clang в Ubuntu. Я установил правильные пакеты и могу успешно скомпилировать их с помощью предварительно упакованного clang, но если сделать то же самое с собственной версией, это приведет к ошибкам из-за отсутствия заголовочных файлов или библиотек. Например:
simulator/fileoutscalarmgr.cc:22:10: fatal error: 'fstream' file not found
22 | #include <fstream>
Я могу это исправить, вручную указав пути включения (мне не нужно делать это с предварительно упакованным clang), но компиляция по-прежнему не удается при связывании, и я не могу это исправить.
Выводы clang -v
при установке --sysroot=/usr/aarch64-linux-gnu
и --target=aarch64-linux-gnu
не совпадают для предварительно упакованных и самостоятельно созданных версий clang. Prepackage способен найти все автоматически:
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc-cross/aarch64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc-cross/aarch64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Хотя тот, который создан из исходного кода, не может найти библиотеки кросс-компилятора (не имеет соответствующего вывода при использовании -v).
Как я могу собрать clang из исходного кода, чтобы найти эти библиотеки?
Да, и то, и другое. Опять же, он отлично работает с предварительно упакованным clang, поэтому моя конфигурация правильна, но то, как я создаю свою собственную версию, как-то неправильно.
Вероятно, у вас другие настройки по умолчанию. Может быть, это -stdlib=libc++
против -stdlib=libstdc++
?
@HolyBlackCat Никаких изменений в поведении между этими двумя нет, есть ли способ найти какие-либо другие флаги по умолчанию, которые может использовать clang?
Предварительно упакованный clang @HolyBlackCat фактически перестает работать с libc++. добавил некоторую информацию в редактирование.
Ubuntu использует API Debian, поэтому вы можете apt-get source ...
получить доступ к пакету, включая всю информацию о сборке, такую как флаги или пути. Таким образом, вам просто нужно будет сравнить свою и их сборку. Я предполагаю: вам также нужна кросс-скомпилированная стандартная библиотека C++.
@UlrichEckhardt Пытаюсь найти что-нибудь подходящее из того, что предоставляет apt source clang
, можете ли вы указать мне правильное направление? У меня определенно уже установлена библиотека aarch64 libstdc++.
Удалось решить проблему! Неявно удаление --sysroot=/usr/aarch64-linux-gnu
приводит к работе clang, созданного из исходного кода. Если просто использовать --target=aarch64-linux-gnu
, все работает нормально. Однако по какой-то причине предварительно упакованный набор все еще может работать с набором sysroot
.
Вы уточняете
--sysroot
? И--target
?