2010-08-05 14 views
5

Po pierwsze, nie wiem, czy istnieje rozwiązanie mojego problemu.Jak opcjonalnie zależeć od udostępnionego obiektu za pomocą gcc?

Mam następującą sytuację:

  • I opracowali bibliotekę ramową, która zależy od kilku innych bibliotek do konkretnego dostępu sprzęt itp
  • Do tej pory ta biblioteka została tylko ramy statycznie połączone przeciw.
  • W przypadku plików wykonywalnych, które używają biblioteki framework, muszą być połączone tylko zależności kodu, który jest faktycznie używany przez plik wykonywalny. (Jeśli w ogóle nie mam dostępu do konkretnego sprzętu, nie muszę polegać na powiązanych bibliotekach).

Teraz muszę również utworzyć obiekt współdzielony biblioteki szkieletowej. Również zależności są dostępne jako biblioteki współdzielone, więc nie ma potrzeby żadnego statycznego łączenia.

Problem mam teraz:

  • Przy budowie aplikacji, która łączy się dynamicznie do biblioteki ramowej muszę albo ogniwo wszystkie zależności dynamicznie do biblioteki ramowej lub aplikacji. (W przeciwnym razie mam referencje niezdefiniowane skarg od LD)

moje pytania:

  • jest jakiś sposób, aby ignorować pewne zależności obiekt udostępniony jeśli wiem, że moja aplikacja nie będzie użyć dowolnego kodu ram biblioteka, która zależy od tego udostępnionego obiektu?

  • Czy można to zrobić bez lub z minimalnymi zmianami kodu? (przełączniki łącznik/kompilatora)

muszę również statyczne linkowanie jak opisano w pierwotnej sytuacji, aby nadal pracować.

Informacje dodatkowe:

  • System operacyjny: Linux (Debian Lenny)
  • Kompilator: gcc-4,3

Odpowiedz

6

Od man ld

--as potrzebne
--no-as-potrzebne

Ta opcja dotyczy tagów ELF DT_NEEDED dynamicznych bibliotek wymienionych w wierszu poleceń po - potrzebna opcja. Normalnie, łącznik doda znacznik DT_NEEDED dla każdej biblioteki dynamicznej wymienionej w wierszu poleceń, niezależnie od tego, czy biblioteka jest rzeczywiście potrzebna. --as-needed powoduje, że znacznik DT_NEEDED może być emitowany tylko dla biblioteki, która spełnia odniesienia do symboli z regularnych obiektów, które są niezdefiniowane w punkcie, w którym biblioteka była połączona, lub jeśli biblioteka nie została znaleziona na listach DT_NEEDED inne biblioteki połączone z tym punktem, odniesienie z innej biblioteki dynamicznej. --no-as-needed przywraca domyślne zachowanie.

Nie użyłem tego sam, ale brzmi jak to, czego szukasz.

g++ -o your_app -Wl,--as-needed -lframework -la -lb -lc -Wl,--no-as-needed 

Edit (sugerowane przez Hanno)

--warn-nierozwiązane-symbole

Jeżeli łącznik ma zamiar zgłosić nierozwiązane symbolu (patrz opcja - nierozwiązane symbole) zwykle generuje błąd. Ta opcja powoduje wygenerowanie ostrzeżenia zamiast tego.

+0

oznacza to jako odpowiedź najbliżej rozwiązania, które życzę. Mimo to wymaga to wszystkich bibliotek dostępnych na początkowym łączu aplikacji, ale nie muszą one być dystrybuowane z aplikacją. –

+0

Aktualizacja: Używając -Wl, - warn-unresolved-symbols można sprawić, że obejście będzie wymagało wszystkich bibliotek w czasie połączenia aplikacji. W takim przypadku od dewelopera zależy, czy aplikacja będzie potrzebować nierozwiązanych symboli. –

7

Można, ale to w zasadzie trzeba zrobić wszystko od obsługi biblioteki dynamicznej siebie. tj. dlopen biblioteki, a następnie wyszukaj symbole, których potrzebujesz bezpośrednio z dlsym.

Uczyni to twój kod bardziej skomplikowanym, ile zależy od interfejsu, który masz w bibliotekach.

+0

To dobra wskazówka - ale w moim przypadku spowodowałoby to zbyt duże zmiany w kodzie. –

Powiązane problemy