Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Linker Error!!! Помогите разобраться  (Прочитано 14043 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NatalieZ
Новенький

ua
Offline Offline

« : 16-12-2011 18:17 » 

Добрый день, надо написать много модульную прогу на С.
 Но при подключении модулей у меня возникает постоянно ошибка. Linker не видит ни одного тела функции описанной в модулях.
Linker Error: Undefined Symbol in module Main.CPP

 Я попробовала написать очень простую прогу, но итам тоже ошибка.
 Выкладываю текст проги и модулей.
 Помогите пожалуйста!!! (Работаю в ВС 3.1) Возможно нужны спец настройки для самой оболочки?

Код: (C)
 /********* MAIN.CPP***************/
 #include <conio.h>
 #include <stdio.h>
 #include "out.h"

 void main()
 {
 clrscr();
 out();
 getch();
 }
Код: (C)
 /************* out.h *******************/
 #ifndef OUT_H
 #define OUT_H

 void out(void);

 #endif


Код: (C)
 /*************** out.cpp *******************/
 #include "out.h"

 void out(void)
 {
 printf("\nHello!!!\n");

 }
« Последнее редактирование: 16-12-2011 20:09 от Вад » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 16-12-2011 20:08 » 

Лучше бы как-то поподробнее, т.к. сходу вижу только то, что в out.cpp нигде не включается заголовок, содержащий printf (т.е., stdio.h)
Возможно, линковщик ругается на это. У меня другой компилятор с заголовками, и всё, за исключением вызова clrscr, компилируется, собирается и работает. Давай детали, если есть.

И ещё, ты пишешь, что язык - "С", а файлы у тебя, почему-то, .cpp, что как-то больше принято в C++.
« Последнее редактирование: 16-12-2011 20:10 от Вад » Записан
NatalieZ
Новенький

ua
Offline Offline

« Ответ #2 : 16-12-2011 20:19 » 

Глюк с stdio.h исправила, но проблема не пропала.

Да согласна не С, а С++, сильно спешила когда писала, плюсики не дописала

Использую Borland C++ Version 3.1 в универе все на нем пишут. Возможно гдето в настройках надо что-то исправить.

А если Сделать #include "out.cpp" - это же не правильно будет?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-12-2011 20:36 » 

Глюк с stdio.h исправила, но проблема не пропала.
Тогда, если компилятор не даёт развёрнутого объяснения, что ему не нравится при линковке, могу лишь посоветовать закомментировать по очереди каждую из трёх строчек в функции main и эмпирическим путём выяснить, которая из функций даёт ошибку.
Ещё подумалось: возможно, дело в том, что out.cpp не скомпилирована. К сожалению, в BC++3.1 никогда не писал, поэтому не знаю, как там организована компиляция "составных" проектов из нескольких модулей.
Если ошибка, по итогам вышеуказанного эксперимента, возникает на вызове out(), значит, надо разбираться в том, как организовать такой проект с двумя .cpp-файлами.

Цитата
А если Сделать #include "out.cpp" - это же не правильно будет?
Технически - так можно сделать. #include всего лишь подставляет текст указанного файла в исходный.
Идеологически - так делать не стоит. Модули - они на то и модули, чтобы один ничего не знал про реализацию другого, и всё это компилировалось по отдельности. Кроме того, если у тебя будет 2 .cpp-файла, каждый из которых будет включать в себя out.cpp, этот код просто не слинкуется: линковщик скажет, что у него есть две скомпилированных копии функции out, а так быть не должно.
Записан
NatalieZ
Новенький

ua
Offline Offline

« Ответ #4 : 16-12-2011 20:44 » 

Большое спасибо за подсказки.
Цитата
Если ошибка, по итогам вышеуказанного эксперимента, возникает на вызове out(), значит, надо разбираться в том, как организовать такой проект с двумя .cpp-файлами.

Действительно в Borland C++ 3.1 несколько модулей можно скомпилить только через проэкт. Без него он ничего не видит. Но в проэкт файлы включать тоже надо аккуратно. Если включить все 3 что я написала, то работать не будет.

Еще раз большое спасибо!!!!
« Последнее редактирование: 16-12-2011 20:45 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 17-12-2011 07:41 » new

NatalieZ, да, h-файлы в проект включать не надо, только те файлы (cpp), что являются единицами компиляции, чтобы в результате получались obj-файлы. Для заголовочных файлов там в меню есть отдельный пункт - их список строится автоматически.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines