2012-12-04 13 views
5

Moje IDE: Visual Studio 2010, Używam Qt add-in dla VS, Qt ver. 4.8.1Jak używać prekompilowanych nagłówków w projekcie Qt

mam do czynienia z problemu starając stworzyć prekompilowanego nagłówek (PCH) w moim projekcie Qt.

Moja usuall podejście do tworzenia PCH w projekcie non Qt jest:
1. Utwórz nagłówek;
2. Dołącz pliki, które będą prekompilowane w nagłówku;
3. Dla każdego pliku źródłowego w projekcie określ jego właściwości, jeśli użyje pch;
4. Dla jednego pliku źródłowego w stanie projektu utworzenie pch; 5. Dołącz pch we wszystkich plikach źródłowych.

Jako że te działania się nie powiodły dla projektu Qt zdecydowałem, co się stanie z powodu pch, powinno być dołączone do wszystkich plików generowanych przez MOC.

Przeczytałem artykuł w QtAssistant na prekompilowanych nagłówkach i wykonałem następujące czynności:
1. Utworzono plik nagłówkowy;
2. Dla wszystkich plików .cpp w projekcie ustawionym użyć opcji PCH i dla jednego tworzyć
3. Budynek do QMake generowana projektowi
4. Pobiegłem QMake -Project
5. I zmodyfikowane wygenerowany plik .pro, tutaj jest:

TEMPLATE = app 
TARGET = 
DEPENDPATH += . GeneratedFiles 
INCLUDEPATH += . 
PRECOMPILED_HEADER = StdAfx.h 
QT += network 

# Input 
HEADERS += server.h StdAfx.h 
FORMS += server.ui 
SOURCES += main.cpp server.cpp StdAfx.h.cpp 
RESOURCES += server.qrc 
  1. Pobiegłem QMake
  2. otwarty plik .pro i starał się go zbudować i dostaje błąd:

    Błąd 2 błędu C1083: Nie można otworzyć pliku włączającego: "StdAfx.h": Brak takiego pliku lub katalogu

Co robię źle?

+0

Utworzono StdAfx.h plik i wewnątrz zawiera wszystkie nagłówki, które chcesz skompilować? – drescherjm

+0

Tak, oczywiście! Wspomniałem, że stworzyłem plik .h, ale nie stwierdziłem, że jest to StdAfx.h –

Odpowiedz

3

Znalazłem rozwiązanie.
Jedyne co trzeba zrobić, aby wykorzystać prekompilowanego nagłówek w projekcie jest obejmują następujących oświadczeń w .pro pliku:

CONFIG += nameOfPrecompiledHeader.h 
PRECOMPILED_HEADER = nameOfPrecompiledHeader.h 
win32-msvc* { 
PRECOMPILED_SOURCE = nameOfFileInWhichCreateOptionWillBeSet.cpp /* other .cpp files will be with use option*/ 
} 

po .pro modyfikacji i uruchomione QMake wszystkie pliki .cpp będzie być skonfigurowany do użycia pch i jeden do stworzenia (nameOfFileInWhichCreateOptionWillBeSet) i .pch zostanie wygenerowany

+0

dalsze czytanie: http://qt-project.org/doc/qt-4.8/qmake-precompiledheaders.html – Ich

+1

Chciałbym dodać ostrzeżenie, że przestrzeganie tych wskazówek [może prowadzić do problemów] (https://bugreports.qt.io/browse/QTBUG-44071). Najważniejsze jest to, że QMake automatycznie wygeneruje dla ciebie wstępnie skompilowany plik źródłowy dla Visual Studio, więc nie musisz go tworzyć samodzielnie, jak przy użyciu VS wanilii. – sjdowling

+0

To nie działa na Qt 5.5.0 (OSX). Używanie CONFIG + = precompile_header jako @Gordon Freeman wskazuje, że działa. – Borzh

13

Stwórz swój skompilowany plik nagłówkowy i dołącz żądane nagłówki.

pch.hpp:

// precompiled headers 

// add C includes here 

#ifdef __cplusplus 
// add C++ includes here 

#include <iostream> 
#include <QtGui> 

#endif // __cplusplus 

Następnie w .pro pliku:

CONFIG += precompile_header 
PRECOMPILED_HEADER = pch.hpp 
HEADERS += pch.hpp 

QMake będzie teraz automatycznie ustawić odpowiednie opcje kompilatora.

+0

Czy twoja odpowiedź zawiera jakieś nowe informacje, które nie były objęte moim pytaniem lub moją odpowiedzią? Jaki jest cel twojej odpowiedzi? Do kogo się zwracasz? –

+5

@spin_eight Twoja własna odpowiedź zawiera błędną składnię do dodania prekompilowanego nagłówka do pliku .pro. Opcją 'CONFIG' powinna być' precompile_header', a nie nazwa samego pliku nagłówkowego. Również opcja 'PRECOMPILED_SOURCE' nie jest nigdzie udokumentowana. Moja odpowiedź jest poprawna, jeśli chodzi o dokumenty (i zawsze działało dobrze dla mnie). –

+6

@spin_eight Nie masz racji. Zamiast się powtarzać, po prostu połączę cię z [odpowiednią dokumentacją] (http://qt-project.org/doc/qt-4.8/qmake-precompiledheaders.html), która robi dokładnie to, co pokazałem. –

Powiązane problemy