Форум «Всё о Паскале» _ Ада и другие языки _ Microsoft Visual C++ 2008 не хочет компилировать
Автор: Leidek 21.11.2009 1:55
Я уже полгода наверное мучаюсь с C++. Постоянно Code::Blocks и Microsoft Visual 2008 выдают ошибки. Кто разбирается - напишите пожалуйста небольшой тест-код для MS Visual 2008, чтобы по выдающим ошибкам вы нашли проблему..
Автор: volvo 21.11.2009 3:05
Ты возьми "Hello, World", откомпилируй его и покажи результат. А уж если нет ошибок в "Hello, World" - значит присоединяй свой код, ошибки в нем...
Автор: Leidek 21.11.2009 19:08
#include "stdafx.h" #include <iostream> using namespace std; int main() { cout<<"Hello"<<endl; return 0; }
Вот что я написал. А вот что эта гадина выдает при компиляции -
>------ Построение начато: проект: First_primer, Конфигурация: Debug Win32 ------ 1>Компиляция... 1>First_primer.cpp 1>Компоновка... 1>test.obj : error LNK2005: _main уже определен в First_primer.obj 1>E:\My Documents\Visual Studio 2008\Projects\First_primer\Debug\First_primer.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более 1>Журнал построения был сохранен в "file://e:\My Documents\Visual Studio 2008\Projects\First_primer\First_primer\Debug\BuildLog.htm" 1>First_primer - ошибок 2, предупреждений 0 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Добавлено через 4 мин. Ну здесь я догадался исключить First_pramer.obj из проекта. Но теперь у меня появляется черное окошечко при компиляции и исчезает. А внизу пишет что без ощибок.
Автор: volvo 21.11.2009 19:51
Цитата
Но теперь у меня появляется черное окошечко при компиляции и исчезает. А внизу пишет что без ощибок.
При компиляции или при запуске? Если при запуске - то так и должно быть, ты ж не задерживаешь окно до нажатия любой клавиши, а сразу завершаешь программу. Так с чего оно должно задерживаться?
#include "stdafx.h" #include <iostream> using namespace std; int main() { cout<<"Hello"<<endl;
cin.get(); // Вот теперь должно ждать нажатия клавиши return 0; }
Автор: Leidek 22.11.2009 22:57
Volvo, спасибо. Разобрался. Проще использовать getchar(); Хотя и там свои глюки. Спасибо за советы))
Автор: Getus 23.07.2010 20:19
Здравствуйте! так что все таки обозначает ошибка "обнаружен многократно определенный символ"????
Автор: volvo 23.07.2010 20:53
То и означает, что переменная (ну, если не переменная - то константа, или еще какая сущность - смысл от этого не меняется) с одинаковым именем была описана в разных единицах трансляции. Вот смотри:
f1.cpp
#include <iostream>
int i = 20;
int main() { std::cout << "Hello world: i = " << i << std::endl; return 0; }
f2.cpp
int i = 15;
int f(int x) { return 2 * x; }
Заметила, что в обоих файлах присутствует переменная i? Так вот на этапе компиляции - все в порядке - в каждом файле - своя переменная, файл f1.cpp прекрасно компилируется в f1.obj, f2.cpp - в f2.obj... И тут запускается линкер. Которому надо собрать это все воедино, в exe-шник. А у линкера-то как раз большие проблемы: и в одном и в другом файле он находит упоминание о том, что должна быть переменная i... Но два объекта с одинаковым именем существовать в программе не могут. И какую переменную линкер должен выбрать? Случайную, а вторую - просто вышвырнуть из проекта? Линкер поступает проще: он сообщает программисту об ошибке, и программист должен решать, что выбросить, а что оставить...