Konfiguracja niestandardowego budowania Xcode powoduje, że" biblioteka/plik nie został znaleziony " dla bibliotek statycznych

Mam obszar roboczy z projektem, który łączy się ze statycznymi bibliotekami w innym projekcie (który również znajduje się w obszarze roboczym). Jest to problem w Kobold2D nie byłem w stanie rozwiązać, mimo że rozumiem przyczynę i przypuszczam, że jest to podobne do tego pytania.

Cele projektu i cele biblioteki statycznej mają konfiguracje budowaniaDebug iRelease . Wszystko w porządku.

Teraz ktoś dodaje nową konfigurację build na przykład w projekcie i nazwach Ad-Hoc . Teraz cel projektu buduje konfigurację Ad-Hoc , jednak biblioteki statyczne nie mają takiej konfiguracji. Wygląda na to, że domyślnie budują konfigurację Release .

Na końcu, gdy linker ma wszystko połączyć, to się nie udaje:

ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1

Dla przymusowo załadowanych bibliotek przez -force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a błąd jest podobny, ale mówi "file not found". Należy pamiętać, że biblioteka "libbox2d-ios."znajduje się na liście fazy budowania" link binary with libraries".

Oczywiście problem polega na tym, że linker zakłada, że biblioteki znajdują się w folderzeAd-Hoc-iphoneos w BUILT_PRODUCTS_DIR, podczas gdy znajdują się w folderzeRelease-Iphoneos , ponieważ nie mają konfiguracji kompilacjiAd-Hoc .

Jak mogę uderzyć linkera w twarz i powiedzieć mu, żeby zabrał biblioteki tam, gdzie są? Najlepiej szukam rozwiązania, które działa w obu przypadkach, tj. biblioteki dodały standardowy sposób (link binarny z fazą budowania bibliotek) oraz biblioteki, które do działania potrzebują dodatkowego-force_load.

Mam nadzieję, że jest jakiś sposób na:

    [39]}wymusza umieszczanie bibliotek w folderze konfiguracji kompilacji docelowej aplikacji Po kompilacji i przedlinkowaniu skrypt kopiuje każdą bibliotekę do folderu konfiguracji kompilacji.]}
  • określa względną ścieżkę do bibliotek
  • użyj innego makro inne niż $BUILT_PRODUCTS_DIR for-force_load
  • flaga linkera jak-WTFmake-all-problems-go-away
Przepraszam, ale muszę to powiedzieć ... :)
Author: Community, 2011-12-15

7 answers

Niestety nie znalazłem na to sposobu. Najlepszym obejściem, jakie mogę znaleźć, jest dodanie nowych celów zamiast nowych konfiguracji. Na przykład w jednym z moich projektów mam tylko konfiguracje Release i Debug, ale mam dodatkowe cele o nazwie "MyProject-app store" i "MyProject-ad hoc". Będzie to możliwe tylko wtedy, gdy masz kontrolę nad plikiem projektu, oczywiście.

Duplikowanie celów siedzących jest denerwujące w skrajności, ponieważ można dodawać pliki do jednego celu i zapomnij dodać je do innych, a nie dowiesz się, dopóki nie spróbujesz go zbudować. Ale buduje, co jest win (z Xcode tak czy inaczej).

Podobne pytanie zadałem jakiś czas temu: jaki jest prawidłowy sposób ustawiania konfiguracji build w projekcie ios przy użyciu bibliotek statycznych do tworzenia archiwum w xcode 4?

 6
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:21

Jak powiedział w podobnym pytaniu statyczna Biblioteka iOS jako podprojekt projektu, który ma niestandardowe konfiguracje budowania?, poprawką jest dodanie tej linii

$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Do celu Framework Search Paths, Header Search Paths i / lub Library Search Paths

 25
Author: ULazdins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:44

Coś mi pasuje.

W projekcie z konfiguracją Adhoc build, zastąp "Per-configuration build Products Path "(CONFIGURATION_BUILD_DIR) i" PER-configuration Intermediate Build Files Path " (CONFIGURATION_TEMP_DIR), aby konfiguracja adhoc build używała tego samego folderu co konfiguracja wydania.

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Teraz, gdy robisz kompilację Adhoc, Xcode umieści libFoo.a i Bar.aplikacja w folderze Release-iphoneos. Linker będzie szczęśliwy i możesz użyć -force_load $(BUILT_PRODUCTS_DIR) / libFoo.a jak zwykle.

Alternatywnie możesz dodać folder Release-Iphoneos do ścieżek wyszukiwania biblioteki dla konfiguracji adhoc build:

Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

Ale wtedy będziesz musiał ustawić inny-force_load dla każdej konfiguracji budowania:

Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
 18
Author: lukelutman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-12 15:59:05

Mam podobny problem z używaniem CocoaPods i starając się mieć więcej niż jedną konfigurację Adhoc (lub Enterprise, lub Beta).

Oto, co wydaje się działać (powiedzmy, że oba projekty leżą w tej samej przestrzeni xcworkspace):

  • Dodaj subproject wygenerowany lib do pliku binarnego mainproject z bibliotekami.

  • Ponieważ konfiguracja {[3] } nie jest znana przez subproject, Xcode użyje konfiguracji Release jako alternatywnej (a może pierwszej konfiguracji listy), gdy buduję go.

  • Linker będzie narzekał, bo nie może znaleźć lib ... ok, zajmijmy się tym.

  • Dodaj Run Script build phase do mainproject, zaraz po docelowej fazie zależności. Wpisz ten skrypt:

if [ "$CONFIGURATION" = "Adhoc" ]; then
    echo "====================================="
    echo "Copying libPods Release into the Adhoc product build dir!"
    echo "====================================="
    cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR"
else
    echo "No manual lib copy."
fi

To skopiuje lib wygenerowany przez subproject Release build (co stanie się po zbudowaniu mainproject) w katalogu Adhoc build, tak że linker znajdzie lib. I powinniśmy być gotowi! Tak!

 5
Author: MonsieurDart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-15 10:40:49

Mój framework jest zbudowany przy użyciu innego projektu SDK wewnątrz mojego projektu aplikacji. Najpierw mam "Debug" i "Release", a następnie dodaję nową konfigurację"TestFlight" . Nie mogę archiwizować z tym nowym. Zakończyłem dodanie nowej konfiguracji build o tej samej nazwie w projekcie SDK . Innymi słowy, dodałem konfigurację "TestFlight" zarówno do mojej aplikacji, jak i projektów SDK. Teraz Archiwum działa.

Nie wiem, czy to najlepszy sposób. Ale wygląda na wystarczająco czysty. na razie. :)

Oh, a dla Cocoapods , po skopiowaniu konfiguracji, jeśli uruchomisz pod install od razu otrzymasz żółte Ostrzeżenie:

[!] CocoaPods nie ustawił podstawowej konfiguracji Twojego projektu, ponieważ twój projekt ma już niestandardowy zestaw konfiguracji. Aby integracja CocoaPods w ogóle działała, należy ustawić podstawowe konfiguracje celu ...

Musisz przejść do projektu, zakładka "informacje", sekcja "konfiguracje", wybierz nową konfigurację, którą właśnie utworzyłeś, i ustaw "Pods.uwolnij"wszystkich celów do "Brak" jako pierwszy. Po tym, można uruchomić pod install bezpiecznie.

 4
Author: Hlung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 13:33:34

Możesz dodać CONFIGURATION_BUILD_DIR= / Some/Shared / Dir przed uruchomieniem xcodebuild. Na przykład:

cd SOURCE_DIR
xcodebuild  -workspace YourProject.xcworkspace -scheme YourScheme -configuration AdHoc -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="`pwd`"/build
 0
Author: Roman Busygin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-25 04:42:25

Zazwyczaj mam schemat AppStore (zmapowany do mojego AppStore config).

Jedna rzecz, która mi się przydarzyła, to kwestia uwzględniająca wielkość liter, która sprawiała, że Cocoapods generował folder kompilacji dla Pods.build wewnątrz Release-iphonesimulator (jako awaryjny) zamiast AppStore-iphonesimulator.

Chyba chybiłem-kliknąłem, gdy połączyłem schemat i konfigurację i dopiero usunięcie go i ponowne dodanie sprawiło, że zrozumiałem, co poszło nie tak. Sprawdź różnicę.

newralgiczny problem

Używałem cocoapods 0.38.2, więc to była oczywiście błędna Konfiguracja użytkownika, a nie problem Cocoapods, który został rozwiązany na 0.34

 0
Author: Carlos Ricardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-18 18:15:24