„Nie udało się załadować wtyczki platformy” xcb „” podczas uruchamiania aplikacji qt5 w systemie Linux bez zainstalowanego qt


101

Napisałem aplikację na Linuksa, która używa Qt5.

Ale kiedy próbuję uruchomić go na Linuksie bez zainstalowanego Qt SDK, wynik w konsoli to:

Nie udało się załadować wtyczki platformy „xcb”. Dostępne platformy to:

Jak mogę to naprawić? Może muszę skopiować jakiś plik wtyczki? Kiedy używam ubuntu z zainstalowanym Qt5, ale zmieniam nazwę katalogu Qt, pojawia się ten sam problem. Więc używa jakiegoś pliku z katalogu Qt ...

AKTUALIZACJA: kiedy tworzę w katalogu aplikacji folder „platformy” z plikiem libqxcb.so , aplikacja nadal się nie uruchamia, ale komunikat o błędzie zmienia się:

Nie udało się załadować wtyczki platformy „xcb”. Dostępne platformy to:

xcb

Jak to się stało? W jaki sposób wtyczka platformy może być dostępna, ale nie można jej załadować?


1
Dla wyjaśnienia, czy biblioteki Qt są rzeczywiście zainstalowane?
cmannett85

1
Jeśli zainstalowana jest biblioteka Qt, program działa normalnie. Jeśli nie jest zainstalowany lub katalog qt sdk nie zostanie znaleziony, program nie będzie działał.
lokomocja

Upewnij się, że skopiowałeś również libQt5Gui.so.5
edaniels

1
Dla tych, którzy przyjeżdżają tutaj z programu uruchamiającego Eve Online: używaj eveonline.sh, nie eveonline- program uruchamiający ma wszystkie biblioteki w pakiecie ze specjalnymi wersjami.
Ondra Žižka

Odpowiedzi:


59

Użyj ldd (man ldd), aby wyświetlić zależności bibliotek współdzielonych. Uruchomienie tego na libqxcb.so

.../platforms$ ldd libqxcb.so

pokazuje, że xcb zależy od libQt5DBus.so.5 oprócz libQt5Core.so.5 i libQt5Gui.so.5 (i wielu innych bibliotek systemowych). Dodaj libQt5DBus.so.5 do swojej kolekcji współdzielonych bibliotek i powinieneś być gotowy, aby przejść dalej.


1
Dziękuję Ci! Na tym właśnie polegał problem. libQt5DBus.so.5 powinien być wymieniony w dokumentacji wraz z rdzeniem i interfejsem GUI.
dzlatkov

4
W moim przypadku sudo apt-get install libx11-xcb1naprawiono problem. Ale twoja rekomendacja użycia lddbyła tym, co wskazało mi właściwą bibliotekę do zainstalowania. Dzięki!
Daniel

4
W moim przypadku musiałem również dodać libQt5XcbQpa.so.5 do folderu lib.
elsamuko

5
Jeśli po przejściu dalej masz ten problem ldd, spróbuj znaleźć plugins/platformskatalog w instalacji Qt. Spróbuj skopiować cały katalog w to samo miejsce, w którym znajduje się plik binarny lub udostępniony plik biblioteki. Jeśli to działa, można ustawić LD_LIBRARY_PATH(hacky) lub, jak wspomniano w odpowiedzi przez @bossbarber, QT_QPA_PLATFORM_PLUGIN_PATH.
csl

1
W moim przypadku nie utworzyłem katalogu / usr / bin / platform. Rozwiązany za pomocą: sudo ln -sf / usr / lib / x86_64-linux-gnu / qt5 / plugins / platform / / usr / bin /
gipsh

56

Jak napisano wcześniej, musisz upewnić się, że instalujesz wtyczki platformy podczas wdrażania aplikacji. W zależności od tego, jak chcesz wdrożyć rzeczy, istnieją dwie metody informowania aplikacji o miejscu, w którym wtyczki platformy (np. Platformy / wtyczki / libqxcb.so) znajdują się w czasie wykonywania, co może działać dla Ciebie.

Pierwszym jest wyeksportowanie ścieżki do katalogu za pomocą zmiennej QT_QPA_PLATFORM_PLUGIN_PATH.

QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app

lub

export QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins
./my_qt_app

Inną opcją, którą wolę, jest utworzenie pliku qt.conf w tym samym katalogu, co plik wykonywalny. Zawartość której będzie:

[Paths]
Plugins=/path/to/plugins

Więcej informacji na ten temat można znaleźć tutaj oraz przy korzystaniu z qt.conf


1
Łał! Dzięki wielkie! Nie wiedziałem o qt.conf, powinno znaleźć się na pierwszej stronie często zadawanych

w moim przypadku z jakiegoś powodu ścieżka wewnątrz qt.conf (Plugins = plugins) nie została rozpoznana. Skończyło się na tym, że dostałem pusty plik qt.conf, który pozwolił na nadpisanie globalnych (zakodowanych na stałe) ścieżek za pomocą qt.conf-defaults, w moim przypadku plugins-Subfolder w katalogu app.
B Piltz,

1
Zastanawialiśmy się, dlaczego LD_LIBRARY_PATHnie działa, ale QT_QPA_PLATFORM_PLUGIN_PATHudało się. Super dzięki.
Ahmed Fasih

1
Drugi lub trzeci raz dochodzę do tej odpowiedzi i za każdym razem pomaga.
kyb

26

Próbowałem uruchomić mój plik binarny, skompilowany z Qt 5.7, na Ubuntu 16.04 LTS, na którym Qt 5.5jest preinstalowany. To nie zadziałało.

Najpierw przejrzałem sam plik binarny, lddtak jak tu zasugerowano, i „spełniłem” wszystkie „nie znalezione” zależności. Następnie This application failed to start because it could not find or load the Qt platform plugin "xcb"rzucono ten notoryczny błąd.

Jak rozwiązać ten problem w systemie Linux

Po pierwsze, powinieneś stworzyć platformskatalog, w którym znajduje się twój plik binarny, ponieważ jest to miejsce, w którym Qt szuka biblioteki XCB. Skopiuj libqxcb.sotam. Zastanawiam się, dlaczego autorzy innych odpowiedzi o tym nie wspomnieli.

Następnie możesz chcieć uruchomić swój plik binarny z QT_DEBUG_PLUGINS=1ustawioną zmienną środowiskową, aby sprawdzić, które zależności libqxcb.sonie są „spełnione”. (Możesz również użyć ldddo tego, jak zasugerowano w zaakceptowanej odpowiedzi).

Wynik polecenia może wyglądać następująco:

me@xerus:/media/sf_Qt/Package$ LD_LIBRARY_PATH=. QT_DEBUG_PLUGINS=1 ./Binary
QFactoryLoader::QFactoryLoader() checking directory path "/media/sf_Qt/Package/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/media/sf_Qt/Package/platforms/libqxcb.so"
Found metadata in lib /media/sf_Qt/Package/platforms/libqxcb.so, metadata=
{
    "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
    "MetaData": {
        "Keys": [
            "xcb"
        ]
    },
    "className": "QXcbIntegrationPlugin",
    "debug": false,
    "version": 329472
}


Got keys from plugin meta data ("xcb")
loaded library "/media/sf_Qt/Package/platforms/libqxcb.so"
QLibraryPrivate::loadPlugin failed on "/media/sf_Qt/Package/platforms/libqxcb.so" : "Cannot load library /media/sf_Qt/Package/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5DBus.so.5: version `Qt_5' not found (required by ./libQt5XcbQpa.so.5))"
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".

Available platform plugins are: xcb.

Reinstalling the application may fix this problem.
Aborted (core dumped)

Zwróć uwagę na wadliwą libQt5DBus.so.5bibliotekę. Skopiuj go do ścieżki bibliotek, w moim przypadku był to ten sam katalog, w którym znajduje się mój plik binarny (stąd LD_LIBRARY_PATH=.). Powtarzaj ten proces, aż wszystkie zależności zostaną spełnione.

PS dzięki autorowi tej odpowiedzi za QT_DEBUG_PLUGINS=1.


1
Zauważyłem, że chociaż istniały nieokreślone zależności między libQt5xcbQpa.so.5 i libQtDBus.so.5, nadal potrzebowałem dodać folder platform, jak wskazałeś. TO połączenie sprawiło, że to zadziałało.
BSD

Czy ktoś może wskazać mi wyjaśnienie „For Dummies”, jak naprawić ten błąd? Nie mam pojęcia, co to wszystko oznacza, potrzebuję instrukcji krok po kroku, jak rozwiązać ten problem w systemie Linux.
John Smith

@JohnSmith, lepiej, jeśli powiesz nam, co dokładnie nie ma dla Ciebie żadnego sensu. Następnie postaramy się rozwinąć.
Neurotransmiter

11

Ubuntu 16.04 64-bitowy. Mam problem najwyraźniej bez powodu. Poprzedniej nocy obejrzałem film na mojej instancji VideoLan, tego wieczoru chciałbym obejrzeć inny z VideoLan. VLC po prostu nie chciał działać z powodu błędu w pytaniu. Wyszukałem trochę w Google i znalazłem rozwiązanie, które rozwiązało mój problem: od teraz VLC działa tak jak wcześniej. Rozwiązaniem jest to polecenie:

sudo ln -sf /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ /usr/bin/

Nie jestem w stanie wyjaśnić, jakie są jego konsekwencje, ale wiem, że tworzy to brakujące symboliczne łącze.


2
Nie używaj -f --forceflagi, dopóki naprawdę nie wiesz, co robisz. Może to spowodować inne problemy.
kyb

To właśnie rozwiązało problem z Ubuntu 18.04 (aplikacja, w której występuje problem, to Rescue Time). Po prostu zostaw flagę -f na wypadek, gdybyś już tam był.
Eloff

11

Wypróbowałem główne części każdej odpowiedzi, ale bez skutku. Ostatecznie naprawiłem to, wyeksportowałem następujące zmienne środowiskowe:

LD_LIBRARY_PATH=/usr/local/lib:~/Qt/5.9.1/gcc_64/lib
QT_QPA_PLATFORM_PLUGIN_PATH=~/Qt/5.9.1/gcc_64/plugins/ 

To działało dla mnie na Ubuntu 17.10 (ale mam ten problem od 16.04!) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/. Niestety naprawił tylko mój VLC, a nie Virtualbox, który ma ten sam błąd ...
Koniec

Pracował w Ubuntu 18.04, aby uruchomić texworks 0.6.2.
XavierStuvw

8

Od wersji 5 Qt używa systemu abstrakcji platformy (QPA) do abstrakcji z podstawowej platformy.

Implementację dla każdej platformy zapewniają wtyczki. W przypadku X11 jest to wtyczka XCB. Zobacz wymagania Qt dla X11, aby uzyskać więcej informacji na temat zależności.


Więc muszę tylko zainstalować wszystkie pakiety z listy zależności? I to zadziała? Znalazłem również plik libqxcb.so w katalogu QT SDK, ale umieszczenie go w katalogu usr / lib nie rozwiązało mojego problemu.
lokomocja

Strona Wdrażanie aplikacji na platformach X11 powinna zawierać wszystkie potrzebne informacje.
zamknięcie

Zainstalowałem wszystkie pakiety wymienione na tej stronie, ale to nie pomogło. Znalazłem informację, że wtyczki platformy muszą znajdować się w katalogu pliku wykonywalnego w folderze „platformy”. Umieściłem tam wtyczkę xcb, teraz błąd się zmienił: "Nie udało się załadować wtyczki platformy" xcb ". Dostępne platformy to: xcb"
lokomocja

1
@cloose Znów jest martwy :(
user89

@ user89 nie dla mnie. może tymczasowy problem?
zamknięcie

6

Prawdopodobnie to pomoże. Używam Ubuntu 18.04 i kiedy zainstalowałem Krita przy użyciu metody ppa. Mam ten błąd:

Ta aplikacja nie została uruchomiona, ponieważ nie mogła znaleźć lub załadować wtyczki platformy Qt „xcb” w „”.

Dostępne wtyczki platformy to: linuxfb, minimal, minimalegl, offscreen, wayland-egl, wayland, xcb.

Ponowne zainstalowanie aplikacji może rozwiązać ten problem. Niedonoszony

Bez powodzenia wypróbowałem wszystkie rozwiązania, które znalazłem w tym wątku i na innych stronach.

Wreszcie znalazłem post, w którym autor wspomniał, że można aktywować debugowanie, o którym mowa w qt5 za pomocą tego prostego polecenia:

export QT_DEBUG_PLUGINS=1

Po dodaniu tego polecenia uruchamiam ponownie krita. Otrzymałem ten sam błąd, ale teraz znam przyczynę.

libxcb-xinerama.so.0: nie można otworzyć pliku obiektu współdzielonego: nie ma takiego pliku lub katalogu.

Ten błąd uniemożliwia prawidłowe załadowanie „xcb”. Zatem rozwiązaniem będzie zainstalowanie pliku `libxcb-xinerama.so.0", prawda? Jednak po uruchomieniu polecenia:

sudo apt install libxcb-xinerama

Biblioteka została zainstalowana. Więc użyłem starej sztuczki, tak--reinstall

sudo apt install --reinstall libxcb-xinerama

To ostatnie polecenie rozwiązało mój problem.


6

Ten problem może mieć wiele przyczyn. Kluczem jest użycie

export QT_DEBUG_PLUGINS=1

przed uruchomieniem aplikacji Qt. Następnie sprawdź dane wyjściowe, które wskażą kierunek błędu. W moim przypadku było to:

Cannot load library /opt/nao/plugins/platforms/libqxcb.so: (/opt/nao/bin/../lib/libz.so.1: version `ZLIB_1.2.9' not found (required by /usr/lib/x86_64-linux-gnu/libpng16.so.16))

Ale to jest rozwiązywane w różnych wątkach. Zobacz na przykład https://stackoverflow.com/a/50097275/2408964 .


: facepalm: OMG, ta sama rada PONOWNIE. Nie, to nie dostarcza żadnych przydatnych informacji, a jedynie znacznie bardziej szczegółową wersję tego samego dokładnego błędu. Żadnych wskazówek ani wskazówek na cokolwiek innego do obejrzenia. Niczego nie brakuje, niczego „nie można załadować”, czego jeszcze nie znałem.
John Smith

3

Napotkałem bardzo podobny problem z tym samym komunikatem o błędzie. Najpierw debuguj niektóre, włączając drukarkę Qt Debug za pomocą polecenia wiersza poleceń:

eksport QT_DEBUG_PLUGINS = 1

i ponownie uruchom aplikację. Dla mnie to ujawniło następujące informacje:

„Nie można załadować biblioteki /home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu) ”

„Nie można załadować biblioteki /home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: nie można otworzyć pliku obiektu współdzielonego: Brak takiego pliku lub katalogu) ”

Rzeczywiście, brakowało mi libxkbcommon-x11.so.0 i libxkbcommon-x11.so.0. Następnie sprawdź swoją architekturę używając dpkg z linii poleceń linux. (Dla mnie polecenie „arch” dało inny i nieprzydatny wynik)

dpkg --print-architecture #result dla mnie: amd64

Następnie wygooglowałem „libxkbcommon-x11.so.0 ubuntu 18.04 amd64”, a także libxkbcommon-x11.so.0, co daje te pakiety na packages.ubuntu.com. To mówi mi, z perspektywy czasu, co nie jest zaskakujące, brakuje mi pakietów nazwanych libxkbcommon-x11-0 i libxkbcommon0 i że instalacja tych pakietów będzie zawierała potrzebne pliki, ale wersje deweloperskie nie. Wtedy rozwiązanie:

sudo apt-get update

sudo apt-get install libxkbcommon0

sudo apt-get install libxkbcommon-x11-0


2

Napotkałem ten sam problem po zainstalowaniu Vibera. Miał wszystkie wymagane biblioteki qt w /opt/viber/plugins/. Sprawdziłem zależności /opt/viber/plugins/platforms/libqxcb.soi znalazłem brakujące zależności. Byli libxcb-render.so.0, libxcb-image.so.0, libxcb-icccm.so.4, libxcb-xkb.so.1 Więc mój problem rozwiązany poprzez zainstalowanie brakujących pakietów z tej biblioteki:

apt-get install libxcb-xkb1 libxcb-icccm4 libxcb-image0 libxcb-render-util0


Miałem problem z uruchomieniem Tizen Emulator. To pomogło. Dzięki.
AlexM

2

Spędziłem więc około dnia próbując dowiedzieć się, o co chodzi; wypróbowałem wszystkie proponowane rozwiązania, ale żadne z nich nie działało tak, jak instalowanie bibliotek xcb lub eksportowanie folderu wtyczek Qt. Rozwiązanie, które zasugerowało użycieQT_DEBUG_PLUGINS=1 do debugowania problemu, nie zapewniło mi bezpośredniego wglądu, jak w odpowiedzi - zamiast tego otrzymywałem coś o nierozwiązanych symbolach w Qt5Core.

To dało mi jednak wskazówkę: co zrobić, jeśli próbuje użyć różnych plików z różnych instalacji Qt? Na moim komputerze miałem zainstalowaną wersję standardową w/home/username/Qt/ i kilka lokalnych kompilacji w ramach mojego projektu, które sam skompilowałem (mam również inne niestandardowe zestawy zbudowane w innych lokalizacjach). Za każdym razem, gdy próbowałem użyć któregokolwiek z zestawów (zainstalowanych przez narzędzie do konserwacji Qt lub zbudowanych przeze mnie), otrzymywałem „błąd xcb”.

Rozwiązanie było proste: podaj ścieżkę Qt przez, CMAKE_PREFIX_PATHa nie Qt5_DIRtak, jak ja, i rozwiązało problem. Przykład:

cmake .. -DCMAKE_PREFIX_PATH=/home/username/Qt/5.11.1/gcc_64


O, człowieku, o co chodzi ze światem Linuksa, gdzie każde rozwiązanie w sieci dostarcza nieoczekiwanych błędów zamiast działać? Zawsze? Trzy dni na próbę uzyskania działającego pulpitu w standardowej instalacji Ubuntu. Nie, dla tych, którzy przyjeżdżają tutaj z Google: to rozwiązanie nie działa lepiej niż cokolwiek innego na tej stronie. Zaczynam myśleć, że Linux w ogóle nie działa.
John Smith

1

W moim przypadku musiałem wdrożyć dwie aplikacje Qt na gościu wirtualnej skrzynki Ubuntu. Jednym z nich był wiersz poleceń („aplikacja”), a drugim oparty na interfejsie GUI („app_GUI”).

Użyłem „aplikacji ldd”, aby dowiedzieć się, jakie są wymagane biblioteki, i skopiowałem je do gościa Ubuntu. Podczas gdy wykonywalna "aplikacja" wiersza poleceń działała poprawnie, plik wykonywalny oparty na GUI uległ awarii, powodując błąd "Nie udało się załadować wtyczki platformy" xcb ". Sprawdziłem ldd pod kątem libxcb.so, ale to również nie miało brakujących zależności.

Problem polegał na tym, że chociaż skopiowałem wszystkie właściwe biblioteki, przypadkowo skopiowałem również biblioteki, które były już obecne w systemie gościa .. co oznacza, że ​​(a) nie trzeba było ich kopiować w pierwszej kolejności i (b) gorzej skopiowanie ich spowodowało niekompatybilność między bibliotekami instalacyjnymi. Co gorsza, były niewykrywalne przez ldd, jak powiedziałem.

Rozwiązanie? Upewnij się, że kopiujesz biblioteki pokazane jako brakujące przez ldd i absolutnie żadnych dodatkowych bibliotek .


I rozwiązuję swój problem, korzystając z tej porady, jak?
John Smith

1

W moim przypadku brakujące pliki nagłówkowe były powodem, dla libxcbktórego Qt nie zbudował. Zainstalowanie ich zgodnie z https://wiki.qt.io/Building_Qt_5_from_Git#Linux.2FX11 rozwiązało problem:

yum install libxcb libxcb-devel xcb-util xcb-util-devel mesa-libGL-devel libxkbcommon-devel

1
Tak, myślę, że miałem podobny problem. Nawet skompilowałem qt ze źródła, ale nie zauważyłem, że xcb-toolchain nie jest rozsądny w moim systemie, więc części qt-xcb nie zostały zainstalowane.
shevy

1

Podoba mi się rozwiązanie z qt.conf .

Zbliż qt.confsię do pliku wykonywalnego następnymi liniami:

[Paths]
Prefix = /path/to/qtbase

I działa jak urok: ^)

Przykład roboczy:

[Paths]
Prefix = /home/user/SDKS/Qt/5.6.2/5.6/gcc_64/

Dokumentacja na ten temat znajduje się tutaj: https://doc.qt.io/qt-5/qt-conf.html


I "umieszczam qt.conf blisko pliku wykonywalnego", jak dokładnie?
John Smith

Utwórz plik z prezentowaną zawartością. cd path/to/executable; vim qt.conf, wklej. Zapisz i wyjdź.
kyb

0

Łączę wszystkie elementy Qt statycznie z ogólnymi wersjami Linuksa moich projektów open source. To trochę ułatwia życie. Musisz tylko najpierw zbudować statyczne wersje bibliotek Qt. Oczywiście nie można tego zastosować do oprogramowania zamkniętego z powodu problemów licencyjnych. Wdrażanie aplikacji Qt5 w systemie Linux jest obecnie nieco problematyczne, ponieważ na przykład Ubuntu 12.04 nie ma bibliotek Qt5 w repozytoriach pakietów.


0

Miałem ten problem i miałem przeczucie, że usunąłem konfiguracje Qt z mojego środowiska. To znaczy,

rm -rf ~/.config/Qt*

Następnie uruchomiłem qtcreator, który zrekonfigurował się z istniejącym stanem maszyny. Nie pamiętał już, gdzie są moje projekty, ale oznaczało to po prostu, że musiałem ponownie przeglądać je „po raz pierwszy”.

Ale co ważniejsze, zbudował sobie spójny zestaw ścieżek do bibliotek, więc mogłem ponownie zbudować i uruchomić pliki wykonywalne projektu bez zaginięcia bibliotek xcb lub qxcb.


Qtcreator podaje dokładnie ten sam błąd, który próbuję rozwiązać. Oczywiście. Ponieważ gdybym znalazł choćby jedno działające rozwiązanie dowolnego problemu z Linuksem w Internecie, nie byłby to Linux. Przepraszamy, to jest po prostu niesamowicie frustrujące, cała strona SE z dzikimi gęsimi pościgami bez jednego użytecznego rozwiązania, aby po prostu uzyskać panel pulpitu działający w standardowej instalacji Ubuntu bez błędów. Zaczynam wątpić, że Linux w ogóle działa poprawnie.
John Smith

To nie pomogło w moim przypadku.
Eugene Gr. Philippov

-4

sudo ln -sf /usr/lib/...."adapt-it"..../qt5/plugins/platforms/ / usr / bin /

Tworzy symboliczne łącze, które zostało pominięte. Dobre dla QT! Dobre dla VLC !!


2
wyjaśnij swoją odpowiedź
Anantha Raju C

Nie działa. Ponieważ nic nie działa. Ta strona jest w 100% błędna, nie działa ani jedno z „rozwiązań”.
John Smith

@JohnSmith sądząc po liczbie głosów za odpowiedziami, niektóre z nich z pewnością działają dla niektórych osób. Niestety nic nie działa i rozumiem twoją frustrację. Ale jeśli nic nie działa, spróbuj przeprowadzić własne badania i prześlij odpowiedź, która zadziałała w Twoim przypadku. To znaczy, daj spokój, używasz platformy od 5 lat i masz tylko 6 odpowiedzi? Z pokorą radzę oddać społeczności zamiast narzekać. Jesteśmy tu, aby sobie nawzajem pomagać.
Neurotransmitter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.