2015-12-14 11 views
10

Używam this answer do utworzenia mapy modułu, aby utworzyć moduł dla CommonCrypto, dzięki czemu mogę go używać w ramach.Mapa modułu prywatnego dla architektury

Robi to jednak oznacza, że ​​wszelkie projekty, które używam tego w ramy mają dostęp do CommonCrypto z import CommonCrypto - a nawet gorzej, deklarując CommonCrypto w innym ram i importowanie to do rezultatów projektu w Redefinition of module 'CommonCrypto' błędów.

tj. następujących ustawień:

MainProject 
    |--> import FrameworkA - module map for CommonCrypto 
    |--> import FrameworkB - module map for CommonCrypto 

Czy istnieje sposób, aby utworzyć moduł mapę, ale mają to prywatny do tego ram jej stworzony/stosowanego w? (Podobnie jak w atrybucie dostępu Swift dla frameworku dostęp do atrybutu internal). The llvm Clang docs show a private attribute, ale nie mogę się dowiedzieć, gdzie umieścić to na mojej mapie modułu, a może nie być nawet w tym celu! Jest też export attribute, ale znowu nie jestem całkowicie pewien, jak tego użyć ...!

To mój moduł map używam do CommonCrypto - w $(SDKROOT) zostaje zamienione w fazie budowy do właściwej lokalizacji (dla iphoneos lub iphonesimulator SDK):

module CommonCrypto [system] [extern_c] { 
    umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h" 
    export * 
} 

To działa prawidłowo (z wyjątkiem ciebie nie mogę "przejść do definicji", ale nie mam nic przeciwko temu) do użycia w FrameworkA/FrameworkB.

+0

Witam, czy ktoś się z tym zaktualizował? Mam dokładnie taką samą konfigurację dla libz :( – tmpz

+1

Rich, czy mógłbyś podać swój skrypt fazy budowy, który zastąpi $ (SKROOT)? Dzięki! – appleitung

+1

@appleitung: Skrypt jest tutaj: gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7, a następnie ustaw to tak: postimg.org/image/fj7j9nsqp w projekcie Nie zapomnij dodać katalogu $ (PROJECT_DIR)/$ (TARGET_NAME)/ExternalFrameworks/również do ustawienia kompilacji * Framework Search Paths. mapy powinny siedzieć w folderze katalogów wejściowych - z nazwą folderu zawierającą nazwę modulemap jest to nazwa – Rich

Odpowiedz

4

Zastrzeżone: Nie próbowałem tego na CommonCrypto ale to działa na moim przypadku z libz

Możliwym rozwiązaniem tego problemu jest stworzenie module.private.modulemap jak opisano w Clang documentation

Tak na przykład w FrameworkA można zapisać plik module.modulemap dla FrameworkA tak:

module FrameworkACommon { 
} 

n chcesz utworzyć plik jak tak

explicit FrameworkACommon.Crypto [system] [extern_c] { 
    header "/Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h" 
    link "CommonCrypto" 
    export * 
} 

Następnie powtórz dla FrameworkB module.private.modulemap.

Teraz CommonCrypto jest prywatnym modułem zarówno w FrameworkA, jak i FrameworkB, a nazwy nie będą kolidować.

+0

Miło! Dziękuję za udostępnienie - spróbuję! – Rich

+0

@tmpz Dostaję dużo "użycia niezadeklarowanego typu ...". Ty masz do czynienia z tym? – azimov

+0

Prawdopodobnie dostajesz niezadeklarowanego typu, ponieważ twój moduł nie eksportuje żadnych nagłówków. "Eksportuj *" wyeksportuje nagłówki do 'FrameworkACommon' i zaimportuje je musisz napisać' FrameworkA Common.Crypto' ale na tym skończy.Wyeksportowane nagłówki nie będą widoczne w przeszłości za pomocą programu FrameworkACommon, są teraz wewnętrzne. – tmpz

Powiązane problemy