No entanto, outro problema vinculador
-
18-09-2019 - |
Pergunta
Eu estou tendo um problema de ligação com um programa C ++ básico. Não, eu não estou incluindo arquivos .cpp
!
Isto é o que está acontecendo.
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!!";
}
O que está acontecendo é que eu recebo um erro do compilador vai: várias definições de alguma função C padrão, tais como strtod
:
g ++ -o ... main.o
build / .... main.o: Função Em `Strtod ':../ MinGW / bin /../ lib / gcc / mingw32 / 3.4.5 /../../../../ incluem / stdlib.h: 318: múltipla definição de `strtod '
build / .. something.o:. ... something.cpp :( texto + 0x0): primeiro definido aqui collect2: ld voltou 1 status de saída
Se eu me livrar de #include <iostream>
em uma das duas ocasiões e se livrar dos cout
s, ele irá compilar. O que está acontecendo? Estou usando g ++ e NetBeans para compilar.
Eu tentei na linha de comando:
g++ *.h *.cpp -o program
e aconteceu a mesma coisa.
Solução 6
O problema estava em um multi-instalação de MinGW. Eu tinha um já instalado, e quando cheguei Qt no meu computador, ele havia instalado seu próprio MinGW. Bummer, eu portado o código para os servidores da minha universidade e funcionou OK.
Bummer !!
Obrigado a todos pela ajuda, com certeza vou seguir suas diretrizes no futuro.
Nomes de cabeçalho - sem sublinhados Tipo de retorno correto código real nos fóruns!
Leo Bruzzaniti
Outras dicas
Por favor note que _HEADER_H
é um nome ilegal no código do usuário C ++ - nomes que começam com o sublinhado e uma letra maiúscula são reservados para a implementação C ++. Isso normalmente não causa problemas visíveis, mas quando você usar o que pode ser um nome comum em execução como HEADER neste contexto, bem poderia.
Modificar,
Something::printContents()
{
std::cout << "This class's Contents!!";
}
NOTA:. Especifique o tipo de dados de retorno
Um dos seus problemas é aqui:
Eu tentei na linha de comando: g ++ * .h * Programa CPP -o
Não passe seus arquivos de cabeçalho ... Tente algo parecido com isto:
g ++ * programa CPP -o
Eu não poderia reproduzir o seu problema exato. Recebo esta para compilar e ligar muito bem com os seguintes algumas notas:
- Adicionar um tipo
void
retorno à funçãoprintContents
(Então ele dizvoid printContents();
no cabeçalho evoid Something::printContents() {
no arquivo de implementação) - Use
std::cout
ao invés de apenascout
.cout
não é definido no escopo é usado - Certifique-se de extremidades header.h com uma linha em branco
- Use
HEADER_H
em vez de_HEADER_H
(como Neil Butterworth diz)
Eu uso o g++ main.cpp something.cpp
linha de comando para compilar.
Eu vejo um par de problemas. Você shuold definir o valor retorno da função
printContents()
e você deve escrever
std::cout
Se você não escrever
using namespace std;