2012-04-26 7 views
11

Używam libcurl w projekcie Mac zbudowanym i skompilowanym na OS 10.7 Lion. Mogę po prostu połączyć się z biblioteką dynamiczną, używając opcji -lcurl w innych znacznikach Linker lub dodając bibliotekę do mojego projektu. Wszystko działa tak, jak powinno.W Xcode, jak połączyć bibliotekę dynamiczną (libcurl), aby aplikacja działała również na starszych wersjach systemu Mac OS?

Chciałbym, aby aplikacja działała również na OS 10.6 i 10.5. Ustawiłem odpowiednio cel wdrożenia. Kiedy uruchamiam aplikację w jednej z tych wersji systemu operacyjnego, pojawia się błąd dyld:

Biblioteka nie załadowana: /usr/lib/libcurl.4.dylib Powód: Niezgodna wersja biblioteki: X wymaga wersji 7.0.0 lub nowszy, ale libcurl.4.dylib zapewnia wersję 6.0.0.

Jest to podobny problem w systemie Mac OS 10.5.

Jak mogę utworzyć łącze do biblioteki libcurl systemu w Xcode na Mac OS 10.7, aby aplikacja działała również w wersjach 10.6 i 10.5?

Mam spojrzał na kilka opcji:

  1. Jednym z nich jest, aby zmienić SDK Base jak zasugerowano w tym poście: Mac OS X libcurl dylib compatibility version Jeśli mogę to zrobić, aplikacja działa poprawnie. Ale to nie jest opcja dla mnie. Muszę używać pakietu SDK 10,7, więc cofanie się do starszej wersji SDK jest niedopuszczalne.

  2. Próbowałem słabe łączenie z biblioteki przy użyciu opcji -weak_library /usr/lib/libcurl.dylib w Inne flagi linker. Aplikacja uruchamia się, ale następnie ulega awarii, gdy próbuję odwoływać się do symboli libcurl. Jednak wiem, że to nie jest problem z niekompatybilnym kodem, ponieważ działa on po zmianie Base SDK.

  3. Próbowałem już dynamicznie ładować bibliotekę w kodzie za pomocą dlopen ("libcurl.dylib", RTLD_LOCAL | RTLD_LAZY); Biblioteka wydaje się ładować, ale muszę ręcznie powiązać wszystkie symbole, które wymieniłem?

Z pewnością musi istnieć sposób na zrobienie tego. Biblioteka libcurl jest instalowana na Mac OS 10.5, 10.6 i 10.7, ale aplikacja nie może korzystać z dostępnej biblioteki w starszych wersjach systemu Mac OS. Jak mogę to naprawić?

Odpowiedz

7

Niektóre opcje:

  • Przejście z libcurl do API ramowych Mac (CFNetwork, NSURLConnection, etc.)
  • produkcji opakowań i własną wersję libcurl z aplikacji, zamiast polegania na biblioteki systemowej .
  • Skopiuj lub dowiązanie symboliczne do biblioteki pośredniczącej z pakietu SDK odpowiadającej celowi wdrożenia i dołącz do niej jawną ścieżkę.
+0

Dzięki Ken. Pierwsza opcja nie działa. Uruchomiłem FTP przez SSL i ani CFNetwork, ani NSURLConnection nie obsługują go. To było zdecydowanie pierwsze miejsce, na które patrzyłem. =) Zdecydowanie wolałabym unikać pakowania mojej własnej wersji libcurl z aplikacją, więc zajrzę do dowiązania symbolicznego do kodu pośredniczącego. Obawiam się, że celuję w 10,5 i nawet nie wiem, czy ten SDK jest dostępny dla Xcode 4.3 na Lionie. – Philip

+1

Zaznaczam twoją odpowiedź jako poprawną i polecając innym użytkownikom, postępuj zgodnie z trzecią opcją. Właściwie działającym rozwiązaniem jest uzyskanie poprzedniej wersji SDK i skopiowanie z niej libcurl.4.dylib do wersji 10.7 Katalog SDK - który jest teraz zawarty w pakiecie aplikacji Xcode. Najpierw wykonaj kopię zapasową oryginału. Łącza Xcode względem tej wersji biblioteki, udostępniając nagłówki dla nowszej wersji w wersji 10.7. Oznacza to, że aplikacja powinna sprawdzić dostępność symboli przed użyciem ich w kodzie. – Philip