Вопрос

У меня возникла проблема со связыванием с базовой программой на C ++.Нет, я не включаю .cpp файлы!

Это то, что происходит.

main.cpp:

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

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

заголовок.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!!";
}

Что происходит, так это то, что я получаю сообщение об ошибке компилятора:несколько определений некоторой стандартной функции C, такой как strtod:

g++ - o ...главный.o
сборка/....main.o:В функции `strtod':

../MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../ включить/stdlib.h:318:множественное определение `strtod'

build/..something.o:...something.cpp :(.текст+0x0):впервые определенный здесь collect2:ld возвращен 1 статус выхода

Если я избавлюсь от #include <iostream> в одном из двух случаев и избавиться от couts, он будет скомпилирован.Что происходит?Я использую g ++ и NetBeans для компиляции.

Я попробовал в командной строке:

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

и произошло то же самое.

Это было полезно?

Решение 6

Проблема заключалась в многократной установке MinGW.У меня уже был один установленный, и когда я установил Qt на свой компьютер, он установил свой собственный MinGW.Облом, я портировал код на серверы моего университета, и он работал нормально.

Облом!!

Спасибо всем за помощь, я обязательно буду следовать вашим рекомендациям в будущем.

Названия заголовков - без подчеркивания Правильный возвращаемый тип Реальный код на форумах!

Лео Бруззанити

Другие советы

Пожалуйста, обратите внимание, что _HEADER_H является недопустимым именем в пользовательском коде C ++ - имена, начинающиеся с подчеркивания и заглавной буквы, зарезервированы для реализации C ++.Обычно это не вызывает заметных проблем, но когда вы используете то, что может быть общим именем в реализации, например HEADER в этом контексте, это вполне может произойти.

Изменять,

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

ПРИМЕЧАНИЕ:Укажите возвращаемый тип данных.

Одна из ваших проблем находится прямо здесь:

Я попробовал в командной строке:g++ *.h *.программа cpp -o

Не передавайте свои заголовочные файлы...Попробуйте что-то вроде этого:

программа g++ *.cpp -o

Я не смог воспроизвести вашу точную проблему.Я получаю это, чтобы скомпилировать и красиво связать со следующими несколькими примечаниями:

  • Добавить a void возвращаемый тип в printContents-функция (так там написано void printContents(); в заголовке и void Something::printContents() { в файле реализации)
  • Использование std::cout вместо того , чтобы просто cout. cout не определен в области, в которой он используется
  • Убедитесь, что заголовок.h заканчивается пустой строкой
  • Использование HEADER_H вместо того , чтобы _HEADER_H (как говорит Нил Баттеруорт)

Я использую командную строку g++ main.cpp something.cpp для компиляции.

Я вижу пару проблем.Вы должны определить возвращаемое значение функции

printContents()

и вы должны написать

std::cout

если ты не напишешь

using namespace std;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top