Autor Wątek: Prekompilowane nagłówki w wxDev-C++  (Przeczytany 3557 razy)

Offline moraxu

  • Użytkownik

# Lipiec 30, 2010, 19:59:04
Witam!

Mam problem z prekompilowanymi nagłówkami w wxDev-C++. Wg Wiki wxWidgets:

Cytuj
In wxDevCpp, using MinGW and wxWidgets, i found the matter working this way:

      1. Prepare a designated precompile-header file as usual like discussed in the chapters above!
      2. Include this header file in your wxDevCpp project workspace!
      3. Configure this header file to "create precompiled header"!

dodałem nagłówek, który ma być prekompilowany do projektu oraz w jego opcjach zaznaczyłem "Create precompiled header". W Main.cpp zaznaczyłem natomiast "Use precompiled header", ale pomimo tego nagłówek wciąż nie jest prekompilowany - muszę wstawiać zwykłe nagłówki, bo inaczej wyświetli się błąd o braku deklaracji nazw w programie...

Czy wiecie jak rozwiązać ten problem ???

Z góry dzięki wielkie za pomoc ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 30, 2010, 20:06:06
W Visual Studio musisz sobie jeszcze dodać plik CPP, w którym #include'ujesz ten nagłówek i to dla tego CPP ustawiasz "Create precompiled header". Podejrzewam, że w wxDev-C++ jest podobnie.

Offline moraxu

  • Użytkownik

# Lipiec 30, 2010, 20:20:41
Nie działa niestety, ale może ja coś robię źle. Wkleję kod dla świętego spokoju:

Main.cpp:

#include "wxprec.h"

class Aplik : public wxApp
{
public:
virtual bool OnInit();
};

IMPLEMENT_APP(Aplik);

bool Aplik::OnInit()
{
wxFrame* MainWindow = new wxFrame(NULL, -1, _T("Mój program"), wxPoint(50,50),
  wxSize(500, 500), wxDEFAULT_FRAME_STYLE);

MainWindow->Show(TRUE);
return TRUE;
}

wxprec.h:

/////////////////////////////////////////////////////////////////////////////
// Name:        wx/wxprec.h
// Purpose:     Includes the appropriate files for precompiled headers
// Author:      Julian Smart
// Modified by:
// Created:     01/02/97
// RCS-ID:      $Id: wxprec.h 39484 2006-05-31 12:18:02Z ABX $
// Copyright:   (c) Julian Smart
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

// compiler detection; includes setup.h
#include "wx/defs.h"

// check if to use precompiled headers: do it for most Windows compilers unless
// explicitly disabled by defining NOPCH
#if defined(__VISUALC__)   || \
    defined(__DMC__)       || \
    defined(__VISAGECPP__) || \
    defined(__MWERKS__)    || \
    defined(__WATCOMC__)   || \
    defined(__BORLANDC__)


    // If user did not request NOCPH and we're not building using configure
    // then assume user wants precompiled headers.
    #if !defined(NOPCH) && !defined(__WX_SETUP_H__)
        #define WX_PRECOMP
    #endif
#endif

// For some reason, this must be defined for common dialogs to work.
#ifdef __WATCOMC__
    #define INCLUDE_COMMDLG_H  1
#endif

#ifdef WX_PRECOMP

// include "wx/wxchar.h" first to ensure that UNICODE macro is correctly set
// _before_ including <windows.h>
#include "wx/wxchar.h"

// include standard Windows headers
#if defined(__WXMSW__)
    #include "wx/msw/wrapwin.h"
    #include "wx/msw/wrapcctl.h"
    #include "wx/msw/wrapcdlg.h"
    #include "wx/msw/private.h"
    #include "wx/msw/missing.h"
#endif

// include all PalmOS headers at once
#ifdef __WXPALMOS__
#   include <PalmOS.h>
#endif

// include <os2.h>
#ifdef __OS2__
#   include "wx/os2/private.h"
#endif

// include mgl headers
#ifdef __WXMGL__
#   include "wx/mgl/private.h"
#endif

// include the most common wx headers
#include "wx/wx.h"

#endif // WX_PRECOMP

Naglowek.cpp:

#include "wxprec.h"
------------------------------------------

Main.cpp - Use precompiled header
wxprec.h - Use precompiled header/Create precompiled header (program dalej nie kompiluje się i przy tej i przy tej opcji)
Naglowek.cpp - Create precompiled header

Offline Avaj

  • Użytkownik

# Lipiec 30, 2010, 20:27:54
W Visual Studio musisz sobie jeszcze dodać plik CPP, w którym #include'ujesz ten nagłówek i to dla tego CPP ustawiasz "Create precompiled header". Podejrzewam, że w wxDev-C++ jest podobnie.
zależy co jest podpięte pod wxDev-C++, ale u mnie w GCC/MINGW ja po prostu w opcjach projektu odhaczam Precompiled headers i działa, bez żadnych plików cpp dodatkowych

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 30, 2010, 20:43:02
Właśnie znalazłem to:

http://wiki.wxwidgets.org/Precompiled_Headers

...i ta strona mówi, że moja rada to "bullshit", więc chyba jednak wxDev-C++ i VS się różnią pod tym względem :).

Offline moraxu

  • Użytkownik

# Lipiec 30, 2010, 21:07:59
zależy co jest podpięte pod wxDev-C++, ale u mnie w GCC/MINGW ja po prostu w opcjach projektu odhaczam Precompiled headers i działa, bez żadnych plików cpp dodatkowych

1) Tzn. o co chodzi z tym podpięciem ?

2) A w jakim IDE to działa u Ciebie ?

Offline Avaj

  • Użytkownik

# Lipiec 30, 2010, 21:30:06

Offline moraxu

  • Użytkownik

# Lipiec 30, 2010, 21:39:17
OK, dzięki.

Widzę, że jest to Code::Blocks, ale tam aplikacji z wykorzystaniem wxWidgets na pewno robił nie będę bo jak ściągnę tą bibliotekę (wersję stabilną) i potem będę chciał coś napisać w C::B to wyświetli się pełno komunikatów o nieznalezionych plikach nagłówkowych.

Czego ? W skrócie - pliki nagłówkowe tej biblioteki #include'ują inne pliki, które nie istnieją ;D Np. w jakimś *.h #include'owany jest "setup.h", podczas gdy jest tylko np. "setup_inc.h".

Więc pozostanę przy wxDev-C++ (tylko pierwsze muszę znaleźć to rozwiązanie...).

Offline Avaj

  • Użytkownik

# Lipiec 30, 2010, 22:03:18
Lol ;) to nie wina codeblocksa że nie umiesz bibliotek instalować, mi wxWidgetsy działają ładnie w C::B

Offline moraxu

  • Użytkownik

# Lipiec 30, 2010, 22:37:36
Mi też, ale nie przy Empty project.

-----------------------------------------------------

Skupmy się jednak na wxDev-C++.

Offline dikamilo

  • Użytkownik
    • blog

# Lipiec 30, 2010, 23:08:38
Czego ? W skrócie - pliki nagłówkowe tej biblioteki #include'ują inne pliki, które nie istnieją ;D Np. w jakimś *.h #include'owany jest "setup.h", podczas gdy jest tylko np. "setup_inc.h".

lib/gcc_dll/mswu/wx/setup.h

Katalog lib/gcc_dll/mswu jest dodawany do Search directories w projekcie.

Precompiled headers w CB:
http://wiki.codeblocks.org/index.php?title=Precompiled_headers

Bez "Compile file" na .h z pch nie będzie działać.
« Ostatnia zmiana: Lipiec 30, 2010, 23:16:36 wysłana przez dikamilo »

Offline moraxu

  • Użytkownik

# Lipiec 31, 2010, 00:03:17
1) U mnie nie mam folderu gcc_dll.

2) Co do "setup.h" to w jednym pliku #include'owany jest on jako "wx/setup.h", a ja nie mam żadnego "setup.h" w żadnym folderze "wx" (jest w jednym folderze "wx", ale to jest wersja do Visuala i jej oczywiście użyć się nie da).

EDIT:

A co do prekompilowanych nagłówków to znalazłem już coś powodującego błąd.

Zawsze przed wstawieniem zwykłego nagłówka daje się dyrektywę preprocesora, która sprawdza czy zdefiniowana jest nazwa WX_PRECOMP. Wygląda to tak:

#include "wx/wxprec.h"    //Prekompilowany nagłówek
#ifndef WX_PRECOMP
    #include "wx/wx.h"    //Zwykły nagłówek
#endif

Natomiast instrukcje powodujące albo zdefiniowanie albo niezdefiniowanie tej nazwy preprocesora są oczywiście w wxprec.h.

I tam pierwszy człon rozległej dyrektywy warunkowej to:

#if defined(__VISUALC__)   || \
defined(__DMC__)       || \
defined(__VISAGECPP__) || \
defined(__MWERKS__)    || \
defined(__WATCOMC__)   || \
defined(__BORLANDC__)

//... Dalsze szczegóły na razie nie potrzebne
#endif

A mój wxDev-C++ (czyli najnowszy pobrany oddzielnie MinGW) wykłada się właśnie już tutaj ! Sądząc po dwóch nazwach (Visual i Borland) wszystkie nazwy dotyczą kompilatorów czy tam środowisk. Wychodzi na to, że nie uwzględniono w nich nazwy preprocesora tworzonej przez kompilator g++ (używam MinGW)...

Offline dikamilo

  • Użytkownik
    • blog

# Lipiec 31, 2010, 10:53:19
Cytuj
1) U mnie nie mam folderu gcc_dll.
Masz w ogóle jakiś folder w /lib ? ( oprócz watcom). Jeżeli nie to czy kompilowałeś wxWidgets ?

Offline moraxu

  • Użytkownik

# Lipiec 31, 2010, 18:07:43
1) LOL, zapomniałem kompletnie o kompilacji ;D Wiedziałem, że trzeba coś takiego robić jak biblioteka nie jest zintegrowana z IDE, ale wymknęło mi to z głowy. Już wszystko działa w C::B.

Ale to nie była do końca moja wina, bo nawet po kompilacji linker miał jakieś nieprawidłowe ścieżki do wyszukiwania plików bibliotek - np. zamiast folderu gcc_dll - gcc_lib, którego nie ma w całym folderze z wxWidgets.

Ponadto wg moich testów C::B (a więc MinGW --> g++) nie obsługuje Unicode. Gdy w programie używam stringów z polskimi literami (oczywiście w formie z przedrostkiem L - L"Mój program") - wyświetlany jest błąd. Tak też ktoś sądzi na tej stronie.

Więc raczej zostanę przy wxDev-C++...

2) Co do wxDev-C++ - wszystko już w porządku, mam prekompilowany nagłówek: podczas pierwszego buildu wyświetla się napis "Precompiling..." :D :D :D Trwa to 7 sekund (tyle co kompilacja normalnych nagłówków), ale za drugim razem jest to już sekunda ;D

Rzeczywiście było tak jak mówiłem - dyrektywa warunkowa nie uwzględniała kompilatora MinGW - musiałem sam dodawać nazwę preprocesora __MINGW32__.

Ale - to nie to jest najdziwniejsze. Musiałem skopiować dodatkowo zawartość oryginalnego pliku wxprec.h (bo wcześniej po prostu go dodawałem do projektu z oryginalnej ścieżki) i utworzyć taki sam plik w moim projekcie - bo jak dodawałem oryginalny to nie działało...
« Ostatnia zmiana: Sierpień 01, 2010, 00:34:01 wysłana przez moraxu »

Offline dikamilo

  • Użytkownik
    • blog

# Lipiec 31, 2010, 18:47:28
Cytuj
1) LOL, zapomniałem kompletnie o kompilacji Grin  Wiedziałem, że trzeba coś takiego robić jak biblioteka nie jest zintegrowana z IDE, ale wymknęło mi to z głowy. Już wszystko działa w C::B.

Ale to nie była do końca moja wina, bo nawet po kompilacji linker miał jakieś nieprawidłowe ścieżki do wyszukiwania plików bibliotek - np. zamiast folderu gcc_dll - gcc_lib, którego nie ma w całym folderze z wxWidgets.

Ponadto wg moich testów C::B (a więc MinGW --> g++) nie obsługuje Unicode. Gdy w programie używam stringów z polskimi literami (oczywiście w formie z przedrostkiem L - L"Mój program") - wyświetlany jest błąd. Tak też ktoś sądzi na tej stronie.

Więc raczej zostanę przy wxDev-C++...
Nazwa folderu jest zależna od trybu kompilacji (SHARED=0/1). Inicode jest wspierany jak ustawisz UNICODE=1 w config.gcc albo recznie. Oczywiście mówię o kompilacji wxWidgets.