Еще одна проблема компоновщика
-
18-09-2019 - |
Вопрос
У меня возникла проблема со связыванием с базовой программой на 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>
в одном из двух случаев и избавиться от cout
s, он будет скомпилирован.Что происходит?Я использую 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;