J’essaie de comstackr une bibliothèque sur Ubuntu 14.04 avec les paquets gcc-arm-linux-gnueabi
et g++-arm-linux-gnueabi
installés.
La compilation échoue sur le premier fichier source rencontré:
/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.
Lorsque j’effectue une find
je vois que les en-têtes C ++ sont situés à:
$ 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
est déjà fourni en tant que SYSROOT
:
$ ls /usr/arm-linux-gnueabi bin include lib
L’ajout d’un isysroot
n’aide pas:
/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
J’ai compilé la bibliothèque sur d’autres plates-formes (comme Android, iOS et Windows Phone), alors j’ai une bonne idée de ce qu’il faut faire. Ceci est ma première fois avec arm-linux-gnueabi
, cependant.
Quelle est la bonne façon d’inclure les en-têtes et les bibliothèques C ++ lors de l’utilisation du package g++-arm-linux-gnueabi
?
Related: un fichier de spec
ne devrait-il pas déjà gérer cela?
EDIT : voici quelques informations connexes avec -v
. Ces chemins intégrés sont malsains. Il semble que la chaîne d’outils essaie de former le chemin vers les en-têtes C ++, mais elle ne fait pas du bon travail:
/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 : ceci ressemble à un bogue dans les chemins internes utilisés par la chaîne d’outils. Dans les chemins intégrés, notez qu’il y a un /usr/arm-linux-gnueabi
dans le chemin. La réponse ci-dessous fournit une solution de contournement.
Rapport de bogue déposé avec Ubuntu: g ++ – arm-linux-gnueabi ne peut pas comstackr un programme C ++ avec –sysroot .
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) ...
Cela ressemble à un bogue dans les chemins internes utilisés par la chaîne d’outils. Dans les chemins intégrés, notez qu’il y a un /usr/arm-linux-gnueabi
dans le chemin. Rapport de bogue déposé avec Ubuntu: g ++ – arm-linux-gnueabi ne peut pas comstackr un programme C ++ avec –sysroot .
Pour contourner le bogue, les chemins d’access aux en-têtes C ++ doivent être ajoutés explicitement avec -I
:
/usr/arm-linux-gnueabi/include/c++/4.7.3
/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi
Il n’est pas nécessaire de spécifier les bibliothèques C et C ++ lors de la liaison avec --sysroot
car cette option les gère correctement.
Donc, une commande comstack / link ressemblerait à:
/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