Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с makefile'ом, Не могу скомпилировать класс 
:(
    Опции темы
Brain
Дата 3.9.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Здравствуйте.
Проблемы в следующем: имеется main.cpp, OpenGLWindow.cpp, OpenGLWindow.h
И собственноручно сделанный makefile.
OpenGLWindow.cpp и OpenGLWindow.h - это класс.
Вот листинги:
main.cpp
Код

#include <stdio.h>
#include <OpenGLWindow.h>

OpenGLWindow window;

int main(void)
{
    printf("Hello!\n");
    window.a();
    
    return 0;
}

OpenGLWindow.h
Код

#ifndef OPENGLWINDOW_H_
#define OPENGLWINDOW_H_
#include <stdio.h>

class OpenGLWindow
{
public:
    void a();
    OpenGLWindow();
    virtual ~OpenGLWindow();
};

#endif /*OPENGLWINDOW_H_*/

OpenGLWindow.cpp
Код

#include "OpenGLWindow.h"

OpenGLWindow::OpenGLWindow()
{
}
void OpenGLWindow::a()
{
    printf("Hello!\n");
}
OpenGLWindow::~OpenGLWindow()
{
}

Makefile
Код

makefile:

prog: main.o
    @echo Building
    g++ -g -o bin/Prog.run Objects/main.o Objects/ogl.o
    @echo Compilation Complete
    
main.o: OpenGLWindow
    @echo Compiling main
    g++ -Wall -c -g -I. main.cpp -o Objects/main.o
    
OpenGLWindow: OpenGLWindow.cpp OpenGLWindow.h
    @echo Compiling OpenGLWindow
    g++ -Wall -c -g -I. OpenGLWindow.cpp -o Objects/ogl.o

clean:
    -rm Objects/*.o


Прикомпиляции выдает ошибки
Код

make prog 
Compiling OpenGLWindow
g++ -Wall -c -g -I. OpenGLWindow.cpp -o Objects/ogl.o
OpenGLWindow.cpp:6: ошибка: no ‘void OpenGLWindow::a()’ member function declared in class ‘OpenGLWindow’
OpenGLWindow.cpp: In member function ‘void OpenGLWindow::a()’:
OpenGLWindow.cpp:8: ошибка: нет декларации ‘printf’ в этой области видимости
make: *** [OpenGLWindow] Ошибка 1

Что происходит?
PS: Если закомментировать в main.cpp и OpenGLWindow.cpp метод void a(void) все компилится нормально.

PM MAIL ICQ   Вверх
smalcom
Дата 4.9.2008, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 494
Регистрация: 16.10.2004
Где: Dnepr

Репутация: нет
Всего: 7



1. #include <stdio.h> перемести из хедера в код
2. #include <stdio.h> ---> #include <stdio>
3. -I/usr/include



--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
Brain
Дата 4.9.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Проблема не в printf, а в том что OpenGLWindow.cpp не видит OpenGLWindow.h.
Если вставить в header переменную, например:
Код

int inta;

Все нормально.
Но если попробовать ее использовать в cpp-файле:
Код

OpenGLWindow::OpenGLWindow()
{
    inta = 0;
}

То при build'е ничего не получится:
Код

make prog 
Compiling OpenGLWindow
pwd
/home/brain/workspace/OGL
g++ -Wall -c -g -I. -I/usr/include OpenGLWindow.cpp -o Objects/ogl.o
OpenGLWindow.cpp: In constructor ‘OpenGLWindow::OpenGLWindow()’:
OpenGLWindow.cpp:6: ошибка: нет декларации ‘inta’ в этой области видимости
make: *** [OpenGLWindow] Ошибка 1

А она обьявлена в header'е.
Вот так вот. smile 
PM MAIL ICQ   Вверх
Mayk
Дата 4.9.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



не воспризводится на mingw'е.
На время убери из header'а OpenGLWindow.h #include <stdio.h> и сделай 

g++  -E -Wall -c -g -I. OpenGLWindow.cpp -o ogl.i и приведи сюда листинг ogl.i. 

кстати какая версия gcc?

Цитата(smalcom @  4.9.2008,  05:48 Найти цитируемый пост)
1. #include <stdio.h> перемести из хедера в код
2. #include <stdio.h> ---> #include <stdio>
3. -I/usr/include

Все три совета бесполезны.
1) header подключается из кода
2) stdio нет такого хедера вообще. есть cstdio. но если бы stdio.h не находился то компилер бы на это ругался, мы этого не видим
3) -I не переписывает дефолтовые инклюды

Это сообщение отредактировал(а) Mayk - 4.9.2008, 12:14


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Imple
Дата 4.9.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

Репутация: нет
Всего: 87




M
Imple
Тема более соответствует разделу C/C++: Программирование под Unix/Linux



--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
Brain
Дата 4.9.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Mayk, вот версия gcc
Код

$gcc -v
Используются внутренние спецификации.
Целевая архитектура: i486-linux-gnu
Параметры конфигурации: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang
 --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-
clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-
checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Модель многопотоковости: posix
gcc версия 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

4.2.3 вроде не такая сарая
А код ogl.i чет большой очень(968 строк), но ошибку в OpenGLWindow.cpp не выдает.

Это сообщение отредактировал(а) Brain - 4.9.2008, 19:22
PM MAIL ICQ   Вверх
Mayk
Дата 4.9.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 5
Всего: 134



Цитата(Brain @  4.9.2008,  23:07 Найти цитируемый пост)
А код ogl.i чет большой очень(968 строк), но ошибку в OpenGLWindow.cpp не выдает. 

вообще то он не может быть большим если все лишние инклюды(читай: stdio.h) ты в нем порезал, так как каждый из привденных тут файлов содержит <50 строк.

посмотри что у него там внутри (предварительно грохнув все пустые строки в нём), может что нить подозрительное найдётся. попробуй выкинуть весь мусор [типа #1 "openglwine.h"] из ogl.i, скомпилировать его и посмотреть на ошибки. 

убунтвоский gcc 4.2.3 ошибку не воспроизводит. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Brain
Дата 4.9.2008, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Mayk, вот последние несколько строк в ogl.i :
Код

# 4 "OpenGLWindow.h" 2

class OpenGLWindow
{
public:
 int inta;
 OpenGLWindow();
 void a(void);
 virtual ~OpenGLWindow();
}
# 2 "OpenGLWindow.cpp" 2


OpenGLWindow::OpenGLWindow()
{
 inta = 0;
}

void OpenGLWindow::a()
{
 printf("Hello!\n");
}

OpenGLWindow::~OpenGLWindow()
{
}

Вроде все есть...
PM MAIL ICQ   Вверх
Brain
Дата 4.9.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Нашел, переделал, вот безо всякошо мусора...
Код

# 1 "OpenGLWindow.cpp"
# 1 "/home/brain/workspace/OGL//"
# 1 "<втроенный>"
# 1 "<command-line>"
# 1 "OpenGLWindow.cpp"

# 1 "OpenGLWindow.h" 1




class OpenGLWindow
{
public:
 int inta;
 OpenGLWindow();
 void a(void);
 virtual ~OpenGLWindow();
}
# 3 "OpenGLWindow.cpp" 2


OpenGLWindow::OpenGLWindow()
{
 inta = 0;
}

void OpenGLWindow::a()
{
 printf("Hello!\n");
}

OpenGLWindow::~OpenGLWindow()
{
}

PM MAIL ICQ   Вверх
Brain
Дата 4.9.2008, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Разобрался!
Проблема была не в makefile...
Eclipse при генерации header'а вставляет директивы 
Код

#ifndef OPENGLWINDOW_H_
#define OPENGLWINDOW_H_

...

#endif /*OPENGLWINDOW_H_*/

Поэтому cpp-файл не видел h-файл.
Удаляем эти три строки и все работает.
Вот и все!
PM MAIL ICQ   Вверх
Fazil6
Дата 5.9.2008, 12:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 1
Всего: 60



Цитата(Brain @  4.9.2008,  23:07 Найти цитируемый пост)
Разобрался!
Проблема была не в makefile...
Eclipse при генерации header'а вставляет директивы 
................
Поэтому cpp-файл не видел h-файл.
Удаляем эти три строки и все работает.
Вот и все! 

нифига ты не разобрался. Эти директивы нужны. Нужно не удалять их, а просто изменить OPENGLWINDOW_H_ на что-нибудь свое, потому как такой define где-то ранее уже есть, а еще лучше переименовать твои OpenGLWindow.h и OpenGLWindow.cpp потому как судя по твоему решению файлы с таким именем еще где-то есть
PM MAIL   Вверх
Brain
Дата 8.9.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Fazil6, нет, таких файлов точно в каталоге программы нету. Я конечно понимаю что эти директивы не позволяют несколько раз подгружать h-файл, но без них оно хотябы работает.
Только почему, если он уже подгрузил .h-файл, не видит методов класса?
PM MAIL ICQ   Вверх
Fazil6
Дата 8.9.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 1
Всего: 60



Цитата(Brain @  8.9.2008,  17:38 Найти цитируемый пост)
Fazil6, нет, таких файлов точно в каталоге программы нету. Я конечно понимаю что эти директивы не позволяют несколько раз подгружать h-файл, но без них оно хотябы работает.
Только почему, если он уже подгрузил .h-файл, не видит методов класса? 

OPENGLWINDOW_H_ уже раньше определен и поэтому твой h файл с директивами не читается. Если файла нет в твоем каталоге программы, то это не значит, что его нет в самой библиотеке. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1266 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.