2014-11-08 36 views
5

Próbuję skompilować kod w OSX 10.10 za pomocą najnowszych narzędzi wiersza poleceń Xcode. Kompilacja działa, ale łączenie to koszmar. Najpierw pojawia się błąd, że symbol jest wielokrotnie definiowany. Ten błąd jest poprawny, ale definicje są identyczne i nie są kontrolowane w bibliotekach zewnętrznych. Nie mogę wymyślić, jak zmusić linker do zignorowania tego problemu. Ważną informacją jest to, że ten sam kod kompiluje, łączy i działa bezbłędnie na moim systemie Ubuntu, zarówno pod kodem jak i gcc. Ten problem z łącznikiem jest tylko w OS X. Biblioteki są statyczne.Rozwiązywanie problemów z OS X 10.10

Drugi problem, który napotykam, jest jeszcze dziwniejszy. Jeśli usuwam niektóre (niezbędne) funkcje, po prostu mogę skompilować i połączyć program, po uruchomieniu otrzymuję następujący zabawny komunikat: "dyld: Symbol nie znaleziony: __ZNSt12future_errorD1Ev". Do cholery to jest i jak to naprawić? Google nie było pomocne z tego powodu.

Odpowiedz

3

OK, więc rozwiązałem te problemy najlepiej jak potrafię. Oto czego się nauczyłem. Po pierwsze, problem statycznego linkowania nie wydaje się możliwy do rozwiązania na OSX przy użyciu "specjalnej" wersji Clang firmy Apple. Brak edycji kodu źródłowego biblioteki, wydaje się, że nie ma sposobu, aby powiedzieć kompilatorowi, aby ignorował duplikaty definicji symboli. Były kiedyś takie opcje (np. -m), ale wszystkie zostały wycofane na jakiś czas. Dlatego, aby rozwiązać ten problem, musiałem uczynić co najmniej jedną z bibliotek dynamiczną.

Drugi problem wynikał z faktu, że jedna z bibliotek, przeciwko której próbowałem linkować, została w jakiś sposób skompilowana z biblioteką libstdC++. Jednak clang firmy Apple chce domyślnie skompilować wszystko pod kontrolą libC++. Tak więc problem polegał na zgodności dwóch bibliotek --- std :: future_error miał inną zniekształconą nazwę zarówno w środowisku uruchomieniowym (kiedy korzystałem z biblioteki libC++), jak i symbolu z biblioteki libstdC++. Odpowiednim rozwiązaniem tego problemu (który wkręciłem i zrobiłem) było ponowne skompilowanie dowolnej biblioteki w tym projekcie za pomocą biblioteki libC++, ponieważ dwie implementacje standardowej biblioteki nie są, ogólnie rzecz biorąc, kompatybilne.

W każdym razie, mam nadzieję, że przyda się to komuś innemu. Uważam, że to niewiarygodnie frustrujące, że Apple musi być na tyle różne, aby zapewnić, że kompilacje, które działają doskonale pod wieloma kompilatorami pod Linuksem, łamią się okropnie w ich systemie operacyjnym pod ich niestandardową wersją klangu.

+0

Wreszcie - rozwiązanie mojego problemu z linkami do bibliotek C++. Poddałem upgrade do Yosemite, przebudowałem fink i odkryłem, że mój stary kod nie jest już połączony w ten sam sposób "Niezdefiniowane symbole dla architektury x86_64:". Nawiasem mówiąc, wygląda na to, że nie ma już więcej brutalnej siły -start-grupy/- grupy końcowej w lx OSX-a. –