Muszę zbudować bibliotekę statyczną. Chcę używać w mojej aplikacji na iPhone'a i iPada. Kiedy próbuję uruchomić symulator, pojawiają się błędy linkowania. Jestem nowy w rozwoju iOS. życzliwa pomoc;
ld: ostrzeżenie: ignorowanie pliku /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, plik został zbudowany dla archiwum, które nie jest połączoną architekturą (i386) Niezdefiniowane symbole dla architektury i386:
"_OBJC_CLASS _ $ _ netUtils", do którego odwołuje się : objc-class-ref in ViewController.o ld: nie znaleziono symboli dla architektury i386 clang: błąd: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)
Próbowałem dodać i386 w architekturze. ale bez szczęścia
Build Settings -> Build Active Architecture Only
naNo
Czasami tego typu błędy irytują Cię!
Usuwanie danych pochodnych działa dla mnie:
Kroki do naprawienia
1) W XCODE> Windows> Projekt> Wybierz projekt> Usuń dane pochodne> Zamknij XCODE i otwórz go ponownie> Jeśli pojawi się błąd MAC-O-Linker builed nieudany błąd> Odwołaj się do tego łącza> Wyczyść i zbuduj ponownie.
źródło
Twój
libnetUtils.a
jest budowany dla innej architektury niż twój cel.Sprawdź ustawienia kompilacji libnetUtils. Architektury, dla których jest budowany, i lista obsługiwanych architektur muszą stanowić (słaby) nadzbiór architektury twojego celu. Złożoność polega na tym, że wynikowa architektura jest rozłożona na różne ustawienia: „Architektury”, „Buduj tylko aktywną architekturę” i „Prawidłowe architektury”.
Ustawienia „Buduj tylko aktywną architekturę” sprawiają, że jest to szczególnie mylące. Na przykład przypuśćmy, że tworzysz dla symulatora. Jeśli ustawienie „Buduj tylko aktywną architekturę” dla debugowania jest ustawione na NIE, będzie budowane wszystkie architektury wymienione w „Architekturach” i „Prawidłowe architektury” (prawdopodobnie armv7 itp.). Ale jeśli libnetUtils ma to ustawienie ustawione na Yes (Debug: Yes), to buduje tylko dla i386. Więc kiedy twój linker próbuje połączyć armv7 z i386, kończy się to niepowodzeniem.
źródło
Jeśli otrzymam ostrzeżenie o ignorowaniu pliku - uruchomiłbym
lipo -info
zignorowany plik, aby znaleźć jego architekturę, jak poniżejlipo -info libnetUtils.a
To wypisze albo i386, armv6, armv7, armv7s, x86_64 itd. Ogólnie rzecz biorąc, ta architektura musi pasować do docelowej platformy kompilacji. Na przykład
W zależności od niezgodności musisz przebudować bibliotekę na platformę docelową lub zmienić platformę docelową.
Uwaga: W przypadku grubych plików binarnych,
lipo -info
wypisze kombinację powyższych architektur.źródło
Właściwie nie wiem, czy moja rada jest poprawna, ale spróbuj sprawdzić to:
Nie oceniaj mnie, jeśli jestem kapitanem oczywistym :)
źródło
Oznacza to, że biblioteka, której próbujesz użyć, nie została uniwersalnie skompilowana dla symulatora iOS (symbole i386 są przeznaczone dla komputerów Mac). Uruchomienie go na rzeczywistym urządzeniu powinno jednak działać dobrze.
źródło
Miałem ten sam problem i bezskutecznie próbowałem różnych rozwiązań ze strony. Nadal otrzymałem komunikat informujący, że moja biblioteka nie została skompilowana dla arm64.
Wreszcie, jak to rozwiązałem:
Wydaje się, że czasami ustawienia kompilacji wyświetlane przez XCode są niekompletne i nie odpowiadają dokładnie plikowi projektu.
źródło
Należy również sprawdzić, czy cel wdrożenia w ustawieniach kompilacji jest taki sam dla zależności i zależności. Zauważyłem, że mam iOS 13 ustawiony jako docelowy dla biblioteki statycznej, podczas gdy iOS 10.0 został zdefiniowany dla struktury, która zużywa tę bibliotekę. Przełączenie obu na 10.0 rozwiązało problem.
źródło
Dla mnie ustalone było ustawienie
Build Active Architecture Only
toMultiple values
, aby to zrobić, musisz to rozwinąć i ustawićDebug
naYES
iRelease
naNo
. A teraz kompiluje się na moim urządzeniu.źródło
Ten problem nie wystąpi, gdy uruchomimy aplikację na urządzeniu. Możesz to sprawdzić, uruchamiając kod na urządzeniu z systemem iOS.
źródło
Miałem też architekturę armv7s. Usunąłem go i upewniłem się, że armv6 i armv7 są jedynymi wymienionymi. To teraz działa
źródło