2011-02-04 5 views
5

Mam obecnie problemy z linkerem podczas próby kompilacji programu Objective-C i myślę, że powodem, dla którego nie mogę wymyślić problemu, może być niewiedza co do procesu kompilatora.Co to jest proces podczas kompilacji Objective-C

Czy ktoś mógłby mi podać przegląd kroków podjętych podczas kompilacji?

To jak ja obecnie zrozumieć proces.

  1. kompilatora kopiuje zawartość wszelkich włączonych .h plików w pliku, który został zdefiniowany w kompilator nie śledzić czy. Plik h został już dołączony, więc może być zawarty w projekcie wiele razy.

  2. Dowolne pliki .m są kompilowane do kodu równoważnego C (które z kolei są kompilowane do kodu obiektu).

  3. Łącznik tworzy łącza między deklaracjami wprowadzonymi w plikach .h a odpowiednimi funkcjami w kodzie wynikowym. Odpowiednie funkcje określa się, wyszukując je w pliku .m o tej samej nazwie.

  4. Pliki obiektów są ze sobą połączone, tworząc plik wykonywalny, upewniając się, że główna funkcja znajduje się w punkcie wejścia pliku wykonywalnego. Wszelkie deklaracje są prawdopodobnie usunięte, aby zaoszczędzić miejsce?

Zakładając ten jest poprawna (co może nie być), to przypuszczalnie oznacza, że ​​nigdy nie należy #include .m plików, ponieważ będzie prawdopodobnie skończyć z wielu definicji metody, która będzie powodować problemy łącznika.

Dziękuję za każde podświetlenie, które ktoś może wnieść do tego :).

Cheers,

Danny

Odpowiedz

3

Masz pomysł mniej lub bardziej poprawnie. Kilka poprawek:

  1. #include nie sprawdza, czy jest to już uwzględnione lub nie, ale #import nie czek.

  2. .m nie jest najpierw konwertowany na C, a następnie na kod obiektowy. Tak było 20 lat temu, ale tak już nie jest. Jest po prostu bezpośrednio skompilowany do kodu obiektu.

  3. Łącznik nie ma znaczenia, jak plik został nazwany. Możesz użyć różnych nazw plików dla .h i .m. Możesz podzielić implementacje funkcji zadeklarowanych w pliku .h na kilka plików .m, na przykład.

  4. To, czy nieużywane implementacje zostaną usunięte, zależy od kompilatora i opcji kompilatora.

W każdym razie twój wniosek jest poprawny: nigdy nie należy włączać/importować pliku implementacji do innego pliku implementacji. Wystąpi błąd podwójnej implementacji.

+0

Ah ha, to fantastyczne; teraz jest o wiele jaśniej i rozwiązałem problem z linkerem! Wielkie dzięki! :) – Danny