2014-09-28 25 views
7

Próbuję skompilować bibliotekę na Ubuntu 14.04 z zainstalowanymi pakietami gcc-arm-linux-gnueabi i g++-arm-linux-gnueabi.Właściwy sposób na uwzględnienie nagłówków systemu C++ przy użyciu g ++ - arm-linux-gnueabi?

kompilacji nie powiedzie się na pliku pierwszego źródła napotka:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -I. -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 
In file included from cryptlib.h:83:0, 
       from seckey.h:8, 
       from 3way.h:7, 
       from 3way.cpp:5: 
stdcpp.h:14:18: fatal error: memory: No such file or directory 
compilation terminated. 

Kiedy wykonać find widzę że nagłówki C++ znajdują się pod adresem:

$ find /usr -name memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/tr1/memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/memory 
/usr/arm-linux-gnueabi/include/c++/4.7.3/ext/memory 
... 

/usr/arm-linux-gnueabi jest już dostarczono jako SYSROOT :

$ ls /usr/arm-linux-gnueabi 
bin include lib 

dodanie isysroot nie pomaga:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb -isysroot=/usr/arm-linux-gnueabi/include/c++/4.7.3 
--sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 
In file included from cryptlib.h:83:0, 
       from seckey.h:8, 
       from 3way.h:7, 
       from 3way.cpp:5: 
stdcpp.h:14:18: fatal error: memory: No such file or directory 

Mam krzyż skompilowane biblioteki na innych platformach (jak Androidem, iOS i Windows Phone), więc mam dobry pomysł, co należy zrobić. To jest jednak mój pierwszy raz z arm-linux-gnueabi.

Jaki jest właściwy sposób dołączania nagłówków i bibliotek C++ podczas korzystania z pakietu g++-arm-linux-gnueabi?

Powiązane: czy plik spec nie obsługuje już tego?


EDIT: oto niektóre informacje związane z -v. Te wbudowane ścieżki wyglądają na niezdrowe. Wygląda na to, toolchain próbuje utworzyć ścieżkę do nagłówków C++, ale jej nie robi dobrą robotę:

/usr/bin/arm-linux-gnueabi-g++ -v -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp 

... 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include 
End of search list. 
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi) 
... 

Edit: wygląda to na błąd w ścieżkach wewnętrznych stosowanych przez toolchain. W wbudowanych ścieżkach zauważ, że na ścieżce znajduje się dodatkowa /usr/arm-linux-gnueabi. Poniższa odpowiedź zapewnia obejście tego problemu.

Raport o błędach złożony w systemie Ubuntu: g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot.

+1

Jaki jest Twój procesor cel Używasz kompilator linux, ale -mcpu = cortex-m3, co nie jest bardzo prawdopodobne, aby uruchomić Linuksa na najmniej nie w pełni funkcjonalną wersję. Spójrz na [Buildroot] (http://buildroot.uclibc.org/) i skonfiguruj go dla właściwego celu. – yegorich

+0

@yegorich - dziękuję (zapomniałem o uclib i buildroot). To jest w tej chwili test, więc mogę wybrać dowolny procesor do testowania. Jest to test, ponieważ skupiam się na procedurze, a nie na procesorze. Jaki procesor zalecałbyś dla 'arm-linux-gnueabi'? – jww

+1

Spróbuj użyć '--sysroot/usr' zamiast' --sysroot =/usr'? Masz równe znaki na ścieżkach, które zdecydowanie nie powinny być ... –

Odpowiedz

1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi" 
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed 
/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include 
End of search list. 
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi) 
... 

To wygląda jak błąd w wewnętrznych ścieżek używanych przez toolchain. W wbudowanych ścieżkach zauważ, że na ścieżce znajduje się dodatkowa /usr/arm-linux-gnueabi. Raport o błędzie z Ubuntu: g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot.

Aby obejść ten błąd, ścieżki do C++ nagłówki powinny być dodawane bezpośrednio z -I:

  • /usr/arm-linux-gnueabi/include/c++/4.7.3
  • /usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi

Nie ma potrzeby, aby określić ++ bibliotek C i C podczas łączenia z --sysroot, ponieważ opcja obsługuje je poprawnie.

Więc komenda kompilacji/link będzie wyglądać podobnie do:

/usr/bin/arm-linux-gnueabi-g++ ... -mcpu=cortex-m3 -mthumb \ 
    -I/usr/arm-linux-gnueabi/include/c++/4.7.3 \ 
    -I/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi \ 
    --sysroot=/usr/arm-linux-gnueabi test.cpp -o test.exe