Jak pracować z bibliotekami zewnętrznymi podczas kompilacji krzyżowej?

Piszę kod do Raspberry pi ARM target na x86 Ubuntu machine. Używam łańcucha narzędzi gcc-linaro-armhf. Jestem w stanie skompilować i uruchomić kilka niezależnych programów na pi. Teraz chcę połączyć mój kod z zewnętrzną biblioteką, taką jak ncurses. Jak mogę to osiągnąć?

Czy powinienem po prostu połączyć mój program z istniejącym ncurses lib na komputerze hosta, a następnie uruchomić na ARM? (Myślę, że to nie zadziała) Czy muszę pobrać source lub prebuilt wersję lib dla arm, umieścić go w moim lib path, a następnie skompilować?

Jaka jest najlepsza praktyka w takiej sytuacji?

Chcę również wiedzieć, jak to działa dla C stdlib. W moim programie używałem funkcji stdio i działało po kompilacji krzyżowej bez robienia niczego specjalnego. Właśnie podałem ścieżkę dla mojego ramienia gcc w makefile. Więc, chcę wiedzieć, jak to ma poprawne nagłówki std i libs?

Author: jww, 2013-09-19

5 answers

Odnośnie Twoich ogólnych pytań:

Dlaczego biblioteka C działa:

Biblioteka C jest częścią Twojego łańcucha narzędzi. Dlatego znajdują się nagłówki, a program poprawnie łączy się i działa. Dotyczy to również innych bardzo podstawowych bibliotek systemowych, takich jak libm i libstdc++ (Nie w każdym przypadku, zależy to od konfiguracji toolchain).

Ogólnie rzecz biorąc, gdy masz do czynienia z cross-development, potrzebujesz jakiegoś sposobu, aby uzyskać pożądaną bibliotekę cross-compiled. Korzystanie z binariów w ta sprawa jest bardzo rzadka. To znaczy, szczególnie w przypadku sprzętu ARM, ponieważ jest tak wiele różnych konfiguracji i często wszystko jest rozebrane na wiele różnych sposobów. Dlatego binaria nie są za bardzo kompatybilne binarnie między różnymi urządzeniami i konfiguracjami Linuksa.

Jeśli używasz Ubuntu na Raspberry Pi, istnieje szansa, że znajdziesz odpowiednią bibliotekę ncurses w Internecie lub nawet w jakimś repozytorium Ubuntu apt. Typowym jednak sposobem będzie aby skompilować bibliotekę z określonym łańcuchem narzędzi, który posiadasz.

W przypadkach, gdy trzeba skompilować wiele złożonych bibliotek, istnieją rozwiązania, które ułatwiają życie, takie jak buildroot lub ptxdist. Programy te budują kompletne jądra Linuksa i główne systemy plików dla urządzeń wbudowanych.

W Twoim przypadku, tak długo, jak chcesz tylko ncurses, możesz skompilować kod źródłowy samodzielnie. Wystarczy pobrać źródła, uruchomić configure podając swój toolchain przy użyciu opcji --host. Opcja --prefix wybierze katalog instalacyjny. Po uruchomieniu make i make install, biorąc pod uwagę, że wszystko poszło dobrze, otrzymasz zestaw nagłówków i skompilowaną bibliotekę ARM, z którą możesz się połączyć.

Jeśli chodzi o kompilację krzyżową, na pewno znajdziesz mnóstwo informacji w Internecie i być może ncurses ma również kilka wskazówek w dostarczonej dokumentacji.

 17
Author: gerrit zijlstra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 19:01:51

Dla zapytania How the C library works in cross-tools

Podczas kompilacji i budowania łańcucha cross-tool podczas konfiguracji będą dostarczać sysroot.

Jak --with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot --with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

Więc zamiast szukać /lib /usr/include będzie wyglądać / Toolchain / (libc) i (include files) podczas kompilacji

Możesz sprawdzić przez

arm-linux-gnueabihf-gcc -print-sysroot

Ten program gdzie szukać libc .

Również

arm-linux-gnueabihf-gcc -print-search-dirs

Daje jasny obraz

 13
Author: vinay hunachyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 15:52:50

Oczywiście, będziesz potrzebował ncurses skompilowanego dla ARM, na który celujesz - ten na hoście nie przyniesie Ci absolutnie nic dobrego [chyba że Twój host ma procesor ARM - ale powiedziałeś x86, więc najwyraźniej nie w tym przypadku].

Mogą być dostępne jakieś prebuiltowe biblioteki, ale podejrzewam, że więcej pracy jest znalezienie takiej (która działa i odpowiada twoim konkretnym warunkom) niż samodzielne budowanie biblioteki ze źródeł - nie powinno to być takie trudne i spodziewam się, że ncurses nie zajmuje zbyt wielu minuty do zbudowania.

 2
Author: Mats Petersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 17:13:39

Jeśli chodzi o twoje pierwsze pytanie, jeśli zamierzasz używać biblioteki ncurses z łańcuchem narzędzi kompilatora krzyżowego, będziesz mieć przygotowane jej binaria zbudowane na arm.

Twoje drugie pytanie brzmi, jak to działa z bibliotekami std, cóż, naprawdę nie jest to systemowa libc / libm, której toolchain używa do kompilacji / linkowania Twojego programu. Może zobaczysz to z --print-file-name= opcja twojego kompilatora:

arm-none-linux-gnuabi-gcc --print-file-name=libm.a

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a

arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

Myślę, że Twój malinowy toolchain może być taki sam. Możesz spróbować tego Wynocha.

 1
Author: TwoCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 03:07:25

Odpowiedź Vinaya jest dość solidna. Tylko poprawka podczas kompilacji biblioteki ncurses dla raspberry pi opcja Ustawienia rootfs to --sysroot=<dir>, a nie --with-sysroot. To właśnie znalazłem, gdy używałem następującego kompilatora:

arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 1
Author: anaken78,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-30 18:57:47