2010-10-08 6 views
0

J'ai 3 petits fichiers que j'utilise pour faire une bibliothèque statique et une application:Comment résoudre l'erreur de liaison « ne peut pas trouver -lgcc_s »

test.h

#ifndef TEST_H 
#define TEST_H 

class Test 
{ 
    public: 
     Test(); 
}; 

extern Test* gpTest; 

#endif 

test.cpp

#include "test.h" 

Test::Test() 
{ 
    gpTest = this; 
} 

Test test; 

main.cpp

#include "test.h" 
#include <iostream> 

using namespace std; 

Test* gpTest = NULL; 

int main() 
{ 
    return 0; 
} 

BUILD

g++ -c test.cpp -o test.o 
ar cr test.a test.o 
g++ -c main.cpp -o main.o 
g++ main.o -o app -Wl,--whole-archive -L/home/dumindara/intest/test.a -Wl,-no--whole-archive 

erreur (étape de liaison)

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld: cannot find -lgcc_s 
collect2: ld returned 1 exit status 

J'ai tout essayé: en utilisant -static-libgcc et la liaison à statique libstdC++. Je n'arrive pas à faire ça. Tout cela est dû au drapeau --whole-archive. Mais je ne peux pas m'en passer.

+0

Vous semblez avoir oublié le message d'erreur réel? :) –

+0

: D. Oui, j'ai oublié l'erreur. Ajoutée. – nakiya

Répondre

5

Je pense que -- est le problème ici:

-Wl,-no--whole-archive 

Essayez avec

-Wl,-no-whole-archive 

modifier

A propos de ne pas voir le symbole de test dans votre application avec nm app: Je pense vous n'avez pas besoin de -L puisque vous donnez le chemin complet et le nom de test.a - faites soit

-Wl,--whole-archive -L/home/dumindara/intest/ -ltest -Wl,-no-whole-archive 

ou

-Wl,--whole-archive /home/dumindara/intest/test.a -Wl,-no-whole-archive 
+0

Oui, les liens sont corrects maintenant. Mais je ne peux toujours pas voir le symbole 'test' dans mon application avec' nm app'. Que faire? – nakiya

+0

@nakiya voir mon edit –

+0

Merci Dmitry, tu m'as sauvé la vie !!! Le lib n'était pas aimé, je pense. Maintenant ça fonctionne bien. : D – nakiya

6

Vous avez une faute de frappe. -no - archive entière devrait être --no-whole-archive. La correction de la faute corrige l'erreur de l'éditeur de liens.

+0

Arrrgh !!! Foolish me ... – nakiya

4

En ce qui concerne les commentaires jusqu'à présent: il suffit de laisser tomber l'option -Wl entièrement. Laissez g ++ faire sa chose. Comme pour ne pas trouver le test de symbole avec nm, pourquoi s'attendre à autre chose? Vous ne l'utilisez pas, votre programme n'en a pas besoin, donc il n'est pas tiré dedans. (Si pour quelque raison vous devez inclure un fichier objet qui n'est pas référencé, par exemple parce que les initialiseurs statiques feront visible, puis spécifiez l'objet fichier --- ne le mettez pas dans une bibliothèque, qui est le moyen standard de dire ne comprennent pas, sauf si nécessaire)

-. James Kanze

+0

Je vais utiliser 'gpTest'. Pas sous cette forme: ce sera un vecteur contenant toutes les informations de version sur mes bibliothèques statiques liées au programme. Donc, si linker jette 'test' c'est un problème. Je pensais que c'est exactement ce que '--whole-archive' résout. Ai-je tort? – nakiya

0

œuvres d'archives entières, vous n'êtes simplement pas la liaison de la bibliothèque.La bonne chose à faire est:

ar cr libtest.a test.o 

et lien avec

-Wl,--whole-archive -L/home/dumindara/intest/ -ltest 
+0

oui. Dmitry Yudakov et vous monsieur ont raison! – nakiya

0

Juste une remarque: toute archive fonctionne uniquement avec les bibliothèques statiques (.a) non avec les bibliothèques partagées ( de .so) est mon expérience.

+0

Il serait préférable de laisser cela comme un commentaire plutôt que comme une réponse. S'il vous plaît jeter un oeil à [Comment répondre] (http://stackoverflow.com/questions/how-to-answer). –

Questions connexes