2012-08-03 30 views
7

Potrzebuję cross-kompilacji biblioteki C/C++. Biblioteka zależy od kilku bibliotek C/C++. Niektóre biblioteki zależą od innych bibliotek. Wszystkie biblioteki mają skrypt configure. Wiem, jak kompilować i instalować biblioteki w systemie hosta - instaluj zależności przed biblioteką, której potrzebuję. Oczywiście nie będzie to działać podczas kompilacji skrośnej. Wszelkie wskazówki są mile widziane. Dziękuję Ci.Jak przeprowadzić cross-kompilację C++ - biblioteka z zależnościami?

Odpowiedz

8

Ogólnie rzecz biorąc, aby skompilować pakiet autouzyskiwania, należy przekazać kilka dodatkowych argumentów do ./configure: --host i . --host to nazwa systemu, na którym będą działać uruchomione programy, a --build to nazwa systemu, który wykonuje kompilację.

Kiedy mówię "nazwa systemu", mam na myśli krotki formularz ARCH-VENDOR-OS-LIBC. (Na przykład: i686-pc-linux-gnu to krotka opisująca system, z którego aktualnie korzystam.) Czasami części krotki są usuwane, tak jak w przypadku zestawu narzędzi mingw32 (w moim systemie, narzędzia krzyżowe mingw32 są instalowane z krotką i586-mingw32msvc i/lub amd64-mingw32msvc).

(Jest jeszcze jeden argument, aby skonfigurować, --target, który jest dla przekrojów kompilacji kompilatorów i określa system, który kompilator budowany będzie kierować podczas generowania kodu.)

Każdy toolchain ma swój własny podkatalog pod /usr takich jak /usr/i586-mingw32msvc. Będziesz chciał zainstalować nowe pakiety tutaj, aby je znaleźć. Użyj argumentu --prefix do configure.

Więc do cross-kompilacji z mojego systemu GNU/Linux do systemu mingw32, chciałbym uruchomić configure takiego:

./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc 

więc zacząć z liści wykresie zależność i kieruj się ku górze. Możesz także przekazać --enable-static --disable-shared do configure: to zatrzyma tworzenie dynamicznych bibliotek dla pakietów z libtoolem. Być może będziesz musiał zainstalować niektóre pakiety natywnie, a także skompilować je, jeśli pakiet musi uruchomić program jako część kompilacji.

Czasami testy configure nie powiedzie się: na przykład, gdzie próbuje skompilować i uruchomić program. Często te testy ustawiają zmienną pamięci podręcznej, którą można również przekazać w wierszu poleceń do configure. Podobnie można nadpisywać takie rzeczy jak ścieżki programów i flagi kompilacji/łączenia bibliotek. Sprawdź swój pakiet: ./configure --help.

0

Należy utworzyć statyczne biblioteki dla wszystkich zależności i połączyć statycznie z plikiem wykonywalnym. Będziesz musiał użyć kompilatora cross, aby utworzyć te biblioteki. Możesz znaleźć kilka dobrych przykładów, przeglądając "kompilację krzyżową statycznego linku statycznego" pod numer "

3

Nie ma absolutnie żadnego problemu w budowaniu przeciwko skompilowanym krzyżowo bibliotekom współdzielonym, o ile upewniasz się, że budujesz na podstawie nagłówków i bibliotek dla systemu docelowego zamiast hosta rozwoju.

Nawet jeśli zbudowałeś wszystkie oczywiste zależności jako biblioteki statyczne, prawdopodobnie nadal będziesz się łączyć ze wspólnymi bibliotekami wykonawczymi języków C i C++. Należy również upewnić się, że pliki nagłówkowe używane do kompilacji krzyżowej pochodzą z systemu docelowego, a nie od hosta programistycznego.
Nie robienie tego prawdopodobnie będzie działać przez większość czasu. W pozostałym czasie otrzymasz subtelne, trudne do debugowania awarie.

Sposób, w jaki to się dzieje, zależy od tego, jak działa łańcuch krzyżowy i środowisko docelowe. Jak już wspomniałeś, przypuszczam, że to GCC i smak Linuksa jako hosta rozwoju i celu - chociaż zasady odnoszą się również do używania innych hostów programistycznych.

Kompilacje krzyżowe GCC i bin-utils są zwykle budowane w taki sposób, że domyślna biblioteka i ścieżki wyszukiwania nagłówków wskazują na kopię systemu plików głównego systemu docelowego. W tym miejscu linker będzie szukał bibliotek współdzielonych, z którymi można łączyć, i to tutaj instalujesz zależne biblioteki współdzielone, gdy są one zbudowane.

Można zmienić domyślny katalog główny GCC, przekazując opcję --sysroot <mySysRoot> do GCC w wierszu poleceń.