2009-08-19 5 views
0

Je rencontre un problème de liaison avec un programme C++ de base. Non, je n'inclus pas .cpp fichiers!Encore un autre problème d'éditeur de liens

C'est ce qui se passe.

MAIN.CPP:

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

int main() { 
    std::cout << "Hello!"; 
} 

header.h:

#ifndef _HEADER_H 
#define _HEADER_H 

class Something { 
public: 
    printContents(); 
}; 

#endif 

something.cpp:

#include "header.h" 

#include <iostream> 

Something::printContents() { 
    cout << "This class's Contents!!"; 
} 

Ce qui se passe est que je reçois une erreur de compilation va: plusieurs définitions d'une fonction C standard, telle que strtod:

g ++ -o ... main.o
build/.... main.o: En fonction `strtod ':

../MinGW/bin/../lib/gcc/ mingw32/3.4.5 /../../../../ include/stdlib.h: 318: définition multiple de `strtod '

build/.. something.o: ... quelque chose. cpp :(texte + 0x0):. d'abord défini ici collect2: ld retourné 1 état de sortie

Si Je me débarrasse de #include <iostream> dans l'une des deux occasions et se débarrasser des cout s, il compilera. Que se passe-t-il? J'utilise g ++ et NetBeans pour compiler.

J'ai essayé dans la ligne de commande:

g++ *.h *.cpp -o program 

et la même chose est arrivé.

+4

Je suis surpris que vous arriviez même à l'éditeur de liens avec ce code. –

+0

Pouvez-vous spécifier plus de détails dans la façon dont vous compilez et liez? –

+0

J'ai fini par travailler dessus. La fixation du code et le #ifndef ont tout corrigé. Je ne suis toujours pas complètement sûr de la façon dont l'erreur s'est produite. J'ai fait mon propre makefile et les erreurs semblent avoir disparu. –

Répondre

0

Le problème était dans un environnement multi-installation de MinGW . J'en ai déjà installé un, et quand j'ai eu Qt sur mon ordinateur, il avait installé son propre MinGW. Bummer, j'ai porté le code sur les serveurs de mon université et ça s'est bien passé.

Bummer !!

Merci à tous pour l'aide, je vais certainement suivre vos directives à l'avenir.

Noms en-tête - sans tiret Corriger le type de retour Le vrai code dans les forums!

Leo Bruzzaniti

3

L'un de vos problèmes est ici:

J'ai essayé dans la ligne de commande: g ++ * .h * .cpp -o programme

Ne passez pas vos fichiers d'en-tête. .. Essayez quelque chose comme ceci:

g ++ * .cpp -o programme

+0

Oui, mais Netbeans est censé faire les choses correctement, non? – Wookai

+0

Il devrait, mais je ne fais que souligner l'erreur de la tentative sur la ligne de commande. D'autres répondants ont signalé les erreurs de code réelles. –

+0

Je comprends maintenant votre réponse! :) –

4

S'il vous plaît noter que _HEADER_H est un nom illégal dans le code utilisateur C++ - les noms commençant par le trait de soulignement et une lettre majuscule sont réservés pour l'implémentation C++. Cela ne provoque normalement pas de problèmes perceptibles, mais lorsque vous utilisez ce qui peut être un nom commun dans l'implémentation comme HEADER dans ce contexte, cela peut très bien.

4

Modifier,

Something::printContents() 
{  
    std::cout << "This class's Contents!!"; 
} 

REMARQUE: Spécifiez le type de données de retour.

3

Je n'ai pas pu reproduire exactement votre problème.Je reçois ce pour compiler et lier bien avec les quelques notes suivantes:

  • Ajouter un type void de retour au printContents -fonction (Il dit void printContents(); dans l'en-tête et void Something::printContents() { dans la mise en œuvre fichier)
  • Utilisation std::cout plutôt que seulement cout. cout ne définit pas la portée, il est utilisé
  • Assurez-vous header.h se termine par une ligne vide
  • Utilisez HEADER_H plutôt que _HEADER_H (comme Neil Butterworth dit)

-je utiliser la ligne de commande à g++ main.cpp something.cpp compiler.

2

Je vois un couple de problèmes. Vous shuold définir la valeur de retour de la fonction

printContents() 

et vous devez écrire

std::cout 

si vous n'écrivez pas

using namespace std; 
+0

Merci pour le conseil. À l'attention de tout le monde, j'ai eu la syntaxe correcte, le type de retour .. etc. J'ai tapé la question super rapide. Merci pour les conseils si. –

+1

Aussi à l'attention de tout le monde - NE FAITES PAS CELA! Toujours poster du code REAL en utilisant copier et coller. –

+0

J'essaierai mieux à l'avenir - Je suis sûr que tout le monde a traversé le stade «type pour votre vie» .. Mes excuses. –

Questions connexes