‫Cześć i witaj.
‫Na tym wykładzie zrozumiemy główne kroki związane z kompilacją plików C++ w Unreal.
‫Zanurzmy się i zobaczmy, jak działają.
‫Niedługo więc nadejdzie czas, abyśmy zaczęli używać kodu z zewnątrz, z innych plików, i musimy nauczyć
‫się, jak to działa w C++.
‫Aby to zrobić, musimy zboczyć z drogi i bardziej szczegółowo zrozumieć, co
‫się dzieje, gdy kompilujemy nasz kod C++ do pliku binarnego.
‫Oto kroki kompilacji, które są używane.
‫Zaczynamy od twojego kodu, twoich plików C++, twojej głowy plików, wszystko w różnych plikach tekstowych.
‫Są one podawane do narzędzia o nazwie Unreal Handed Tool.
‫Teraz to narzędzie jest odpowiedzialne za pobranie wszystkich nierealnych, określonych fragmentów składni i użycie ich do
‫wygenerowania większej ilości kodu C++.
‫Przyjrzyjmy się więc kilku przykładom, w których mamy tę nierzeczywistą, specyficzną składnię, tę
‫nową klasę pisaną wielkimi literami, która jest nierzeczywistą specyficzną składnią, podobnie jak tutaj API Crypt Reader, a
‫tam wygenerowane ciało.
‫I zasadniczo to, co się tutaj dzieje, to nierealne narzędzie do nagłówków, które zobaczy te różne fragmenty składni w twoim kodzie
‫i uruchomi się, okej, muszę wykonać swoją pracę.
‫Muszę tam wejść, muszę dodać kilka rzeczy.
‫Zastąpi Twoje wygenerowane ciało pakietem kodu, który ułatwi nam życie podczas korzystania z
‫Unreal.
‫Wykonuje również takie rzeczy, jak właściwości U i funkcje U.
‫Dodaje wszystko, czego potrzebuje, aby mógł komunikować się ze światem planu.
‫Więc to jest pierwszy krok.
‫Konwertuje wszystkie swoje nierealne, specyficzne rzeczy do rzeczywistego C++.
‫Gdy mamy już właściwy C++, możemy wprowadzić go do standardowego procesu kompilacji C++, który składa się
‫z trzech kroków.
‫Pierwszym z nich jest zajęcie się etapem przetwarzania wstępnego, więc w rzeczywistości dotknie to dowolnej składni C++ i w rzeczywistości
‫dotyczy tylko wierszy zaczynających się od skrótu.
‫Mamy więc kilka z tych dyrektyw przetwarzania wstępnego.
‫Zajmuje się nimi preprocesor.
‫Następnym krokiem jest to, co nazywamy kompilatorem.
‫Pobiera kod i konwertuje go na wykonywalny plik binarny, ale nie kończy tego kroku, ponieważ robi
‫to tylko na poszczególnych C++, tak zwanych jednostkach tłumaczeniowych, w zasadzie plikach C++.
‫Więc bierze plik C++ i tłumaczy go na binarny indywidualnie, każdy pojedynczy plik C++.
‫A trzecim krokiem jest linker, który łączy to wszystko i wyświetla plik wykonywalny, który możemy
‫uruchomić jako jeden plik wykonywalny.
‫Przyjrzyjmy się więc bardziej szczegółowo tym standardowym krokom kompilacji z przykładowym plikiem.
‫Więc wyobraź sobie, że mieliśmy grę dot CP i jest to bardzo, bardzo prosta gra, ponieważ wszystko, co robi, to dodawanie jednego
‫i jednego razem.
‫Ale żeby dodać jeden i jeden razem, musi użyć funkcji, która jest zadeklarowana w innym pliku w
‫matematyce drugiej.
‫H Tak więc matematyka deklaruje ad, ale tak naprawdę nie definiuje tego, co robi.
‫Tak więc jest to skończone w kroku z kropką matematyczną.
‫Jak widać, jest to bardzo prosta implementacja.
‫Co się dzieje na etapie wstępnego przetwarzania?
‫Cóż, jak powiedziałem, zajmuje się wszystkimi dyrektywami preprocesora, które zaczynają się od
‫skrótu.
‫Więc hash zawiera matematykę, co w zasadzie oznacza, że po prostu skopiuj tutaj wszystko z Mistrza H.
‫Więc to, co robi, to bierze te dwa pliki i łączy je ze sobą, aby utworzyć
‫nowy plik wyjściowy o nazwie game dot, który w zasadzie mam dołączyć i widać, że jest on dołączony.
‫Definicja z masturbacji zastąpiła dyrektywę dotyczącą preprocesora haszującego.
‫Więc teraz gra kropka II ma definicję operacji dodawania, a następnie uruchamiamy preprocesor na CVP z matematycznymi
‫kropkami.
‫Ale ponieważ nie ma żadnych dyrektyw preprocesora, w zasadzie nic się tam nie zmienia.
‫Następnym krokiem jest to, że kompilacja jest prawdopodobnie najważniejszym i najbardziej
‫skomplikowanym krokiem, ponieważ zajmuje się tym C++ w każdym pojedynczym pliku i konwertuje go na binarny, ale nie jest to kompletny
‫binarny, ponieważ na przykład moja gra tak naprawdę nie wie, jak zaimplementować i po prostu zna kształt
‫tej funkcji dodawania.
‫Więc to musi być wypełnione później i to jest wypełniane przez linker.
‫Tak więc link weźmie plik binarny, utworzy go dla pliku obj z kropką gry i
‫plik binarny utworzony dla pliku metody i połączy je, aby stworzyć grę kropka xy, która łączy
‫binarny dla obu i ostatecznie jest kompletnym plikiem wykonywalnym, który my może faktycznie działać, ponieważ zawiera definicję wszystkiego, czego
‫potrzebuje.
‫Dlaczego mamy tak skomplikowany proces?
‫Pomysł polega na tym, że przyspiesza to czas kompilacji.
‫Bo gdybym tylko zrobił łańcuch.
‫Do gry kropka spać.
‫Właściwie nie muszę uruchamiać całego procesu kompilacji.
‫Wszystko, co muszę zrobić, to uruchomić bity związane z grą dot CBP, więc uruchomiłbym preprocesor tylko na CP.
‫Wtedy uruchomiłbym kompilator tylko w grze do I.
‫A potem mogę ponownie wykorzystać wcześniejszy plik matematyczny dot obj.
‫Nie muszę go ponownie kompilować, ponieważ nic się w tym nie zmieniło.
‫Podobnie, gdybym zmienił tylko matematyczne kropki CP, nie musiałbym przekompilowywać gry do pliku OBJ, dlatego jest
‫to wydajniejszy proces i dlatego w pierwszej kolejności to robimy.
‫Więc chciałbym, żebyśmy zrobili mały eksperyment i spróbowali dowiedzieć się, dlaczego dołączyliśmy przesuń kropkę i przenieś jej
‫plik CP z kropkami?
‫Jaki jest tego powód?
‫Dlaczego nie możemy po prostu skompilować pliku C++ bez dołączenia move dot h.
‫Tak więc eksperyment, który zamierzamy przeprowadzić, polega na skomentowaniu linii włączania hash.
‫Tak więc użycie podwójnego ukośnika, aby dodać komentarz przed tą linią, co
‫w zasadzie sprawi, że zostanie on usunięty przez preprocesor zamiast zastępowania go zawartością
‫pliku.
‫Następnie dokonamy ponownej kompilacji i chciałbym, abyś spojrzał na pojawiające się komunikaty o błędach i zobaczył,
‫co jest napisane, aby zobaczyć, czy możesz spróbować zrozumieć, po co uwzględniamy to przeniesienie.
‫Wstrzymaj wideo i spróbuj.
‫Dobra.
‫Witamy spowrotem.
‫Umieśćmy więc podwójny ukośnik na początku tej linii, co w zasadzie czyni ją nieważną i
‫nieważną.
‫A potem zrobimy kontrolkę alt f 11 i przyjrzymy się wynikom kodowania na żywo.
‫Więc spójrz, od razu mamy kilka błędów, bardzo, bardzo wcześnie.
‫Mówi to, że przenoszenie nie jest klasą ani przestrzenią nazw, a jest tu kilka innych rzeczy.
‫Oznacza to, że główny składnik techniczny został uznany za super w klasie lub właściciel przestrzeni nazw
‫jest nieznanym identyfikatorem.
‫I zasadniczo to oznacza, że mówiłeś tutaj o swoim poruszycielu, ale i tak tego nie
‫zdefiniowałeś, nigdzie tego nie zadeklarowałeś.
‫Więc nie wiem.
‫Kompilator C++ mówi, nie wiem co to jest.
‫Więc dlatego mamy hash, w tym mover dot h, ponieważ move it lub H deklaruje klasę.
‫Mówi, że U mover jest klasą i wywodzi się z działania komponentu i ma te metody itp.
‫deklaruje, co to znaczy być tą klasą.
‫Więc bez tej deklaracji kompilator C++ nie może kontynuować i dlatego musimy dołączyć ten plik
‫nagłówkowy.
‫Świetna sprawa.
‫Miejmy więc nadzieję, że teraz rozumiesz nieco lepiej proces związany z kompilacją C++, a
‫zwłaszcza kompilacją C++ w Unreal.
‫Do zobaczenia na następnym wykładzie.