2010-10-12 20 views
0

J'ai une bibliothèque statique. par exemple libpuchuu.a cela dépend de la bibliothèque dynamique. par exemple libSDL.so (mais Evidement, je libSDL.a) Création de libpuchuu.a est simple:La bibliothèque statique g ++ dépend des bibliothèques dynamiques

ar -rcs object_file_1.o object_file_2.o 

Mais je ne peux pas lier mon projet avec libpuchuu.a! références non définies attaquent ma console!

À un forum, j'ai trouvé cette phrase: toutes les dépendances de bibliothèque statique est dans cette bibliothèque si vos fichiers objet dépend de ya, vous devez décompresser (ar) ya les fichiers objets dans votre dossier, puis emballez tous les objets à votre nouvelle bibliothèque Questions:

  1. est-il vrai?
  2. si c'est vrai: fichier d'objet puchuu.o dépend de libSDL.a comment faire libpuchuu.a?
  3. une autre solution?

PS

J'ai fait un exemple simple et affiché à Pastebin:

http://paste.lisp.org/display/115456

commandes bâtiment:

g++ -O3 -c index.cpp -I/usr/local/include/SDL 
g++ -O3 -c lib.cpp -I/usr/local/include/SDL 
ar rv libpuchuu.a lib.o 
g++ -O3 -o program.exe index.o -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows -lSDL_image -L. -lpuchuu 

... références non définies à partir de l'index .cpp!

+1

Vous devez préciser quelles sont les références non définies. Cela peut entraîner la disparition de l'objet partagé. –

+0

Pourriez-vous inclure cela comme texte plutôt que comme image? – Omnifarious

+0

Oh, mec, il y a un avertissement russe là-bas concernant sdldraw !! (ça devrait être mauvais!) :) –

Répondre

2

Avez-vous essayé d'ajouter -lSDL à la ligne de commande de votre éditeur de liens?

Les références non définies sont des symboles que vous essayez de définir en lib.cpp que vous utilisez ar pour les regrouper en libpuchuu.a. Malheureusement, vous ne définissez pas les symboles que vous pensez définir. using namespace sdl; ne provoque pas automagically tout ce que vous définissez pour être dans l'espace de noms sdl. Tout ce qu'il fait est de l'organiser de sorte que lorsque le compilateur cherche un nom particulier, il le recherche dans l'espace de noms sdl avec l'espace de noms principal.

Vous devez envelopper les fonctions définies dans lib.cpp avec namespace sdl { .... functions ... } et votre code sera très bien lié. D'après mon expérience, quand je fais une erreur avec quelque chose d'inhabituel, l'erreur est généralement vraiment stupide et n'a rien à voir avec ce que je ne connais pas. Mais parce que je travaille en territoire inconnu je suppose automatiquement que mon manque de connaissance du territoire doit être en faute, pas que j'ai fait quelque chose de stupide.

Vous pourriez trouver cette expérience applicable. Et, en remarque, l'idée de 'références indéfinies attaquant votre console' est plutôt bizarre et me laisse avec une image de votre écran et de votre clavier laissés dans une ruine fumante après avoir essayé de lier.

+0

de cource. mais les références non définies attaquent! – puchu

+0

@puchu - L'ajout de '-lSDL' aurait dû résoudre votre problème. Si vous fournissez plus de détails sur les commandes exactes que vous exécutez, peut-être que le problème réel sera découvert, recroquevillé dans sa cachette. – Omnifarious

+0

>> Les références non définies sont des symboles que vous définissez dans lib.cpp. comme vous voyez la réponse est comment le réparer. il suffit d'écrire ... – puchu