2010-09-15 5 views
2

Comment compiler avec un autre ensemble de bibliothèques. Quand je compile sur l'ordinateur i686 Fedora 13, cela fonctionne très bien. Cependant, lorsque je prends l'exécutable (via une clé USB) et que j'essaie de l'exécuter sur un autre ordinateur i386, le message d'erreur suivant s'affiche.Compilation croisée avec une autre bibliothèque

/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder) 

Ok, donc je dois compiler en utilisant les bibliothèques i386 donc c'est compatible. Cependant, la machine i368 n'a pas de compilateur. Je dois donc trouver un moyen de compiler en utilisant les bibliothèques de machines i386. Donc, je copie tout l'arborescence de répertoires i386 dans la machine i686 et j'essaie d'utiliser -nostdlib et de pointer toutes les bibliothèques pour utiliser le i386, et j'ai joué avec les réglages toute la journée et je n'ai pas trouvé d'endroit. Je suis allé de l'avant et j'ai essayé de faire un petit programme en tant que test et de voir si je pouvais le faire croiser en premier. Toujours pas de chance.

/// \file main.cpp 
#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <iostream> 
int main() 
{ 
    std::cout << "Testing!" << std::endl; 
    #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING 
     printf("POSIX Thread Priority Scheduling supported\n"); 
    #else 
     #warning "POSIX Thread Priority Scheduling NOT supported." 
    #endif 
    #ifdef _POSIX_THREAD_PRIO_PROTECT 
     printf("POSIX Thread Priority Ceiling supported"); 
    #else 
     #warning "POSIX Thread Priority Ceiling NOT supported" 
    #endif 
    #ifdef _POSIX_THREAD_PRIO_INHERIT 
     printf("POSIX Thread Priority Ceiling supported"); 
    #else 
     #warning "POSIX Thread Priority Ceiling NOT supported" 
    #endif 
    return 0; 
} 

Je compile le programme avec cette commande.

g++ -O3 -pedantic -Wextra -Wall -g -c /home/dmiller3/Experiments/Test2/main.cpp -o obj/Debug/main.o 

Je reçois l'erreur lors de la liaison.

g++ -L../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib -o bin/Debug/Test2 obj/Debug/main.o -nostdlib ../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib/libpthread-2.5.so ../../TargetLibraries/cw_1901-glibc_std-standard-dist/lib/libc-2.5.so 
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 

00000000080482a0 obj/Debug/main.o: En fonction __static_initialization_and_destruction_0': /usr/lib/gcc/i686-redhat-linux/4.4.4/../../../../include/c++/4.4.4/iostream:72: undefined reference to std :: ios_base :: :: Init Init() » ... beaucoup plus d'erreurs ...

Comment compiler avec une autre bibliothèque? Pourquoi dois-je pointer vers la bibliothèque libc (cela ne devrait-il pas être automatique)? J'ai fait quelques recherches sur internet, et certains articles indiquent qu'il me manque un fichier crt0.o, mais je ne trouve pas ce fichier dans l'arborescence de l'i386.

Répondre

1
/usr/lib/libstdc++.so.6: version ‘GLIBCXX_3.4.9’ not found (required by ./Recorder) 

Le libstdC++ sur la machine que vous essayez d'exécuter est plus vieux que celui que vous compilez sur, c'est la raison pour laquelle il se plaint

+0

Alors, comment puis-je compiler en utilisant plus libstdC++, c'est-ce que je suis en train d'accomplir. Je ne peux pas trouver un moyen de pointer le compilateur pour utiliser l'ancien libstdC++. –

+0

@Dennis Miller Vous devez utiliser un compilateur C++ plus ancien, vous aurez généralement besoin de quelque chose comme g ++ - 4.1 ou même g ++ - 3.4 selon le système que vous ciblez. – Artyom

0

GCC en fait des chemins difficiles des codes dans sa source code. Votre meilleur pari est de trouver quelle version de glibc est installée sur votre système cible, puis téléchargez le compilateur pour ce système.

Pouvez-vous décrire votre système plus en détail? Est-ce qu'il tourne sous Linux? Quelle version du noyau et de la glibc/ulibc?

Ce que je devais faire dans une situation similaire est de préciser les comprennent et les chemins de liaison lors de la compilation, de sorte que vous finissez par avoir quelque chose comme ceci:

<path to g++>/g++ -I<includes for my version system libs> -Wl,--rpath-link <custom libs path> -L <same custom libs path> 

Quelques notes:

  • Vous devez faire attention à la priorité de chaque chemin include et lib si vous avez la même bibliothèque dans différents endroits.
  • Vous avez avez pour utiliser une chaîne d'outils compilée de façon croisée, même si elle est comprise entre x86 et x86, car le processus de compilation croisée éliminera de nombreux chemins codés en dur et autres dépendances que GCC a.
  • Vous aurez souvent devez fournir tous les les bibliothèques de votre arc cible à compiler.
  • Jetez un oeil à Linux From Scratch http://trac.cross-lfs.org/ pour une discussion approfondie de la compilation croisée
Questions connexes