Консультация № 172756
30.09.2009, 10:54
0.00 руб.
0 3 1
Здравствуйте!
Решил написать шаблон простейшего приложения (см. код). При попытке компиляции g++ выдаёт (дважды) следующее сообщение:

Цитата: gcc2
g++: Compilation of header file requested


Исполняемый файл программы не создаётся. В чём может быть дело?

Дополнительно:
Операционная система: Haiku 1 alpha.
Компилятор: g++ 2.95.3-haiku-090629 (теоретически должен быть и gcc4, но как его запустить?)
Команда компиляции: g++ TMainForm.h TMainForm.cpp TProgramme.h TProgramme.cpp main.cpp -o HelloWindow -lbe

Приложение:
#ifndef _TMainForm_h_
#define _TMainForm_h_
//-------------------------------------------------------
#include <Window.h>
//-------------------------------------------------------
class TMainForm : public BWindow
{
public:
TMainForm(BRect WindowFrame, const char* psTitle = "Hello Window",
window_type WindowType = B_TITLED_WINDOW,
uint32 uiFlags = B_QUIT_ON_WINDOW_CLOSE,
uint32 uiWorkspaces = B_CURRENT_WORKSPACE);

void MessageReceived(BMessage*);
bool QuitRequested();
};
//-------------------------------------------------------
#endif

#include "TMainForm.h"
//-------------------------------------------------------
#include <Application.h>
#include <Message.h>
//-------------------------------------------------------
TMainForm::TMainForm(BRect WindowFrame, const char* psTitle,
window_type WindowType, uint32 uiFlags,
uint32 uiWorkspaces)
: BWindow(WindowFrame, psTitle, WindowType, uiFlags, uiWorkspaces)
{
}
//-------------------------------------------------------
void TMainForm::MessageReceived(BMessage* pMessage)
{
switch(pMessage->what)
{
default:
{
BWindow::MessageReceived(pMessage);
}
}
}
//-------------------------------------------------------
bool TMainForm::QuitRequested()
{
be_app->PostMessage(B_QUIT_REQUESTED);
return BWindow::QuitRequested();
}
//-------------------------------------------------------

#ifndef _TProgramme_h_
#define _TProgramme_h_
//-------------------------------------------------------
#include <Application.h>
//-------------------------------------------------------
class TMainForm;
//-------------------------------------------------------
class TProgramme : public BApplication
{
public:
TProgramme(const char* psSignature = "application/hello-window");
~TProgramme();

void ReadyToRun();

private:
TMainForm* pMainWindow;
};
//-------------------------------------------------------
#endif

#include "TProgramme.h"
#include "TMainForm.h"
//-------------------------------------------------------
TProgramme::TProgramme(const char* psSignature) : BApplication(psSignature)
{
pMainWindow = new TMainForm(BRect(100, 100, 400, 200));
}
//-------------------------------------------------------
TProgramme::~TProgramme()
{
if(pMainWindow) delete pMainWindow;
}
//-------------------------------------------------------
void TProgramme::ReadyToRun()
{
pMainWindow->Show();
}
//-------------------------------------------------------

#include "TProgramme.h"
//-------------------------------------------------------
int main()
{
TProgramme MyProgramme;
MyProgramme.Run();
return 0;
}
//-------------------------------------------------------

Обсуждение

давно
Старший Модератор
17042
808
30.09.2009, 12:07
общий
Попытка переписать заголовочные файлы по типу #include <app/Message.h>, #include <interface/Window.h> и т.п. к видимому результату не привела: те же сообщения...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
30.09.2009, 12:45
общий
это ответ
Здравствуйте, Dr_Andrew.
Если нет make, то компилировать нужно так:
g++ -o TMainForm.o TMainForm.cpp
g++ -o TProgramme.o TProgramme.cpp
g++ -o main.o main.cpp
gcc -o HelloWindow TMainForm.o TProgramme.o main.o
.h файл не требуется компилировать отдельно. Для защиты от повторного включения можно не городить #ifdef/#define, а достаточно указать в начале .h файла #pragma once .
4
Спасибо, помогло! Правда, обошёлся более простой командой: g++ TMainForm.cpp TProgramme.cpp main.cpp -o HelloWindow
давно
Старший Модератор
17042
808
30.09.2009, 16:45
общий
vladisslav:
Большое спасибо, помогло!
А то сначала подумал, что gcc пути к системным заголовочным файлам найти не может.
Правда, обошёлся более простой командой: g++ TMainForm.cpp TProgramme.cpp main.cpp -o HelloWindow
На Ваш вариант ld ругается...
Интересно, что мой первоначальный вариант команды под Linux вполне нормально проходил (Fedora, Debian, Slackware)...
Насчёт #pragma once - насколько я помню, эта директива нестандартизирована и как раз не всегда дружит с gcc...
Насчёт Makefile Вы правы, надо не лениться писать...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа