21

Rozumiem cel i uzasadnienie nagłówków prekompilowanych. Jakie zasady obowiązują przy ich wdrażaniu? Z mojego rozumowania wynika, że ​​jest to coś w tym stylu:Jak zaimplementować wstępnie skompilowane nagłówki do projektu

  1. Ustaw projekt, aby używać prekompilowanych nagłówków z dyrektywą YU.
  2. Utwórz plik stdafx.h i ustaw go jako prekompilowany nagłówek.
  3. Dołącz to jako górną instrukcję include w każdym pliku .h.

To się zgadza? Czy należy wykluczyć włączenie go do plików zawartych w prekompilowanym nagłówku? Obecnie pojawia się następujący błąd kompilacji, kiedy po mojej intuicji z tego:

błędu C2857: „#include” oświadczenie określony z opcją wiersza polecenia /Ycstdafx.h nie został znaleziony w pliku źródłowego

opcjami wiersza polecenia są takie:

/OD/I "../External/PlatformSDK/Include"/I ".."/I”../ External/atlmfc/Include " /D" _DEBUG "/ D" _UNICODE "/ D" UNICODE " /Gm/EHsc/RTC1/MDd/Yc" stdafx.h " /Fp"....\Output\LudoCore \ Debug \ LudoCore.pch " /Fo" .... \ Wyjście \ LudoCore \ Debugowanie \ " /Fd"**Oddział \ LuDoCore \ Debug \ vc80.pdb" /W4/WX/nologo/c/ZI/TP/wd4201 /errorReport: szybka

Odpowiedz

34

Ty stdafx.cpp powinna zawierać stdafx.h i być zbudowany przy użyciu /Yc"stdafx.h".

Twój inny * .cpp powinien zawierać stdafx.h i być zbudowany przy użyciu /Yu"stdafx.h".

Zwróć uwagę na znaki cudzysłowu używane w opcjach kompilatora!

Oto zrzut ekranu z ustawień Visual Studio dla stdafx.cpp stworzyć prekompilowanego nagłówka:

create precompiled header

Oto odpowiednie opcje wiersza polecenia (które są tylko do odczytu, ale odzwierciedlają ustawienia określone na innych stronach; pamiętać, że IDE wstawia znaki cudzysłowu wokół nazwy pliku, w opcji kompilatora):

options

to, co jest w moim Plik stdafx.cpp:

// stdafx.cpp : source file that includes just the standard includes 
// CallWinsock.pch will be the pre-compiled header 
// stdafx.obj will contain the pre-compiled type information 

#include "stdafx.h" 

// TODO: reference any additional headers you need in STDAFX.H 
// and not in this file 
+0

Czy chcesz powiedzieć, że to powinno być budowane tylko w linii poleceń? W visualowym studiu nie jestem pewien, jak stworzyć coś z pewną właściwością od samego początku. Zawsze wydaje się to być po prostu "Dodaj -> Nowa pozycja -> Nagłówek", itp. – Chris

+0

Kliknij prawym przyciskiem myszy plik cpp i wybierz "Właściwości" w menu kontekstowym. Spośród stron właściwości konfiguracji C++ jest jedna dla "Prekompilowanych nagłówków", która służy do określenia, że ​​ten plik CPP tworzy lub używa skompilowanego pliku nagłówkowego. – ChrisW

+0

Dzięki za aktualizację. Zrobiłem jak pokazano powyżej i nadal nie ma kości. Oto opcje wiersza poleceń w odniesieniu do twojego powyżej:/Od/I "../External/PlatformSDK/Include"/I ".."/I "../External/atlmfc/Include"/D "_DEBUG"/D "_UNICODE"/D "UNICODE"/Gm/EHsc/RTC1/MDd/Yc "stdafx.h" /Fp"..\..\Output\LudoCore\Debug\LudoCore.pch "/ Fo" .. \. . \ Output \ LudoCore \ Debug \\ "/Fd"..\..\Output\LudoCore\Debug\vc80.pdb"/W4/WX/nologo/c/ZI/TP/wd4201/errorReport: prompt – Chris

5

Twój #include "stdafx.h" powinny być w pierwszej linii każdego pliku cpp. Nie powinno się go używać w plikach .h. Poza tym masz rację.

+0

Myślę, że jego problemem jest określenie/Ycstdafx.h zamiast/Yc "stdafx.h". – ChrisW

5

"stdafx" to tylko konwencja. W żaden sposób nie jest to obowiązkowe. W rozwiązaniu wieloprojektowym użyłem innych konfiguracji z wieloma wstępnie skompilowanymi nagłówkami dla różnych części. Na przykład.może być użyteczne posiadanie jednego PCH współdzielonego przez twoje projekty UI i innego dla twoich projektów bazy danych.

Odpowiednie komponenty to nagłówki prekompilowanych plików Xh, plik X.cpp zawierający tylko Xh (i nie dodaje samego kodu) oraz plik X.pch utworzony przez kompilowanie X.cpp (i tym samym Xh) z opcja kompilatora /Yc.

Kiedy teraz kompilacji plik y.cpp z /Yu"X.pch", kompilator odczytuje i odrzuca wszystkiego do #include "X.h". W tym momencie zastępuje swój stan wewnętrzny stanem zapisanym w X.pch, z wyjątkiem strumienia wejściowego (pozostaje Y.cpp, z wskaźnikiem pliku ustawionym na następny wiersz po #include "X.h").

+0

Po prostu edytowane, aby naprawić literówkę. –

10

Studio graficzne może przechowywać wstępnie skompilowane właściwości nagłówków nie tylko według projektu, ale również pliku źródłowego.

Domyślnie wszystkie właściwości są ustawione na "dziedziczą z ustawień domyślnych nadrzędnego lub projektu", co pokazuje wartość obiektu nadrzędnego dla tej właściwości, ale po nadpisaniu na poziomie podrzędnym (w tym przypadku pliku .cpp) plik ignoruje zmiany z właściwości nadrzędnej.

Konfiguracja chcesz to:

  1. Na poziomie projektu z „wszystkich konfiguracjach” wybranych (właściwości projektu, zmiana konfiguracji rozwijanej od debug/release), ustaw skompilowane nagłówek do „użytkowania”
  2. wybierz plik .cpp być źródłem nagłówka (o ile wiem, nie ma znaczenia, który z nich)
  3. prawym przyciskiem myszy i goto właściwości, a następnie wybierz „Utwórz” na skompilowany nagłówku
  4. Wreszcie upewnić że żadne inne pliki .cpp nie mają ustawionych wartości prekompilowanych Właściwość nagłówka (możesz powiedzieć pogrubioną czcionką)
+0

Naprawiono literówkę: "za kompilację" poprawiono na "wstępnie skompilowany". –

Powiązane problemy