Kompilacja projektu na clang12

0

Platforma embedded kompiluje na procesor aarch64 , gcc 9.5 dziala ale eksperymentalnie chcialem skompilowac projekt na clang-12 , niestety utknąłem.

Wyizolowałem problem do takiego kawałka kodu 1.cpp
wystarczy jeden include valarray oraz -std=gnu++17.

#include <valarray> // valarray
void aa()
{
}

buduje kompiluje tak

/opt/tdx-xwayland/5.7.2/sysroots/x86_64-tdxsdk-linux/usr/bin/aarch64-tdx-linux/aarch64-tdx-linux-clang++ \
  --sysroot=/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux  \
  -std=gnu++17 \
  -c 1.cpp

bledy:

In file included from 1.cpp:1:
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/valarray:1214:5: error: exception specification in declaration does not match previous declaration
    begin(valarray<_Tp>& __va) noexcept
    ^
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/bits/range_access.h:104:31: note: previous declaration is here
  template<typename _Tp> _Tp* begin(valarray<_Tp>&);
                              ^
In file included from 1.cpp:1:
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/valarray:1224:5: error: exception specification in declaration does not match previous declaration
    begin(const valarray<_Tp>& __va) noexcept
    ^
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/bits/range_access.h:105:37: note: previous declaration is here
  template<typename _Tp> const _Tp* begin(const valarray<_Tp>&);
                                    ^
In file included from 1.cpp:1:
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/valarray:1234:5: error: exception specification in declaration does not match previous declaration
    end(valarray<_Tp>& __va) noexcept
    ^
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/bits/range_access.h:106:31: note: previous declaration is here
  template<typename _Tp> _Tp* end(valarray<_Tp>&);
                              ^
In file included from 1.cpp:1:
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/valarray:1249:5: error: exception specification in declaration does not match previous declaration
    end(const valarray<_Tp>& __va) noexcept
    ^
/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/lib/aarch64-tdx-linux/9.5.0/../../../include/c++/9.5.0/bits/range_access.h:107:37: note: previous declaration is here
  template<typename _Tp> const _Tp* end(const valarray<_Tp>&);
                                    ^
4 errors generated.

Na jakiej podstawie kompilator szuka swoich systemowych INCLUDE ?
Bo jak zaczynam szukać <valarray> to mam dwa

/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/include/c++/v1/valarray

oraz

/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux/usr/include/c++/9.5.0/valarray

v1/valarray ma w nagłowku "Part of the LLVM Project"
9.5.0/valarray "This file is part of the GNU ISO C++ Library"

Wygląda to trochę tak jakby clang używał błędnego folderu include/

AHA ! bez parametru -std=gnu++17 kompilator działa

2

zakłądam że orasz na yocto, meta-clang?
w recepcie

CFLAGS += "-I/sciezka do include clang"
CXXFLAGS += "-I/sciezka do include clang"

Tak z głowy, odpal chatgpt i zadaj konkretne pytania na podstawie twojej recepty, może sporo podpowiedzieć ale nie raz sie myli.

1

Czemu masz dodane: --sysroot=/opt/tdx-xwayland/5.7.2/sysroots/aarch64-tdx-linux?
Jak używasz clang++ to automatycznie dodawane są include path dla C++ pasujące do danego kompilatora. Jak użyjesz samego clang to wtedy jawnie musisz podać te ścieżki i jawnie likować standardową bibliotekę c++.

Na godbolt działa bez porblemu.

0

zrobiłem eksperyment i zmieniłem nazwę folderu
.../usr/include/c++/v1 na .../usr/include/c++/9.5.0 (tam gdzie szuka clang )
i kompilacja plików większego projektu doszło do 100%
nie przeszło linkowanie finalnej aplikacji

undefined reference to `std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()'

ale z tego co widzę z uporem maniaka uzywa ld zamiast lld

0

kwestia ścieżek. Zakładam ze w recepcie bitbake trzeba parę rzeczy przestawić względem toolchain(co wpsomniałem wyżej).
Popytałem chatgpt o lld i ld przyklad

LD = "${LLVM_DIR}/bin/lld"

# recipe metadata

Chatpgpt dla yocto generuje dużo syfu dlatego trzeba dobrze pytać i weryfikować ale naprowadzić potrafi.

2

Uczynię że chatgpt trochę zmądrzeje
brakuje -rtlib=compiler-rt -stdlib=libc++

1 użytkowników online, w tym zalogowanych: 0, gości: 1