2010-05-01 16 views
14

Próbuję przenieść moją aplikację z ręcznej kompilacji do autoconf, która działa do tej pory bardzo przyjemnie. Ale mam jedną bibliotekę statyczną, której nie mogę wymyślić, jak ją zintegrować. Ta biblioteka NIE będzie zlokalizowana w zwykłych lokalizacjach biblioteki - lokalizacja pliku binarnego (.a) i nagłówka (plik .h) zostanie podana jako argument konfiguracyjny. (Zwłaszcza, nawet jeśli przeniesie się plik .a do/usr/lib lub gdziekolwiek indziej, o czym mogę pomyśleć, to nadal nie zadziała.) Nie jest również nazwany tradycyjnie (nie zaczyna się od "lib" lub "l" ").Autoconf - w tym biblioteka statyczna (początkująca)

Ręczna kompilacja współpracuje z nich (katalog nie jest przewidywalne - to tylko przykład):

gcc ... -I/home/john/mystuff /home/john/mystuff/helper.a 

(Uh, tak naprawdę nie rozumiem, dlaczego plik .a odwołuje się bezpośrednio, a nie z -L lub cokolwiek.Tak, mam na wpół wypalone zrozumienie budowania programów w języku C.)

Tak więc, w moim pliku configure.ac mogę użyć odpowiedniego argumentu configure, aby pomyślnie znaleźć nagłówek (plik .h), używając AC_CHECK_HEADER. Wewnątrz AC_CHECK_HEADER dodajemy lokalizację do CPFLAGS, a #include pliku nagłówkowego w aktualnym kodzie C ładnie ją ładuje.

Biorąc pod uwagę argument konfiguracyjny, który został oddany do $ lokalizacji i nazwy potrzebnych plików są helper.h i helper.a (które są zarówno w tym samym katalogu), tutaj jest to, co działa tak daleko:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"]) 

Tam, gdzie napotykam na trudności, dołącza się plik binarny (plik .a). Bez względu na to, co próbuję, zawsze pojawia się błąd dotyczący niezdefiniowanych odniesień do wywołań funkcji dla tej biblioteki. Jestem prawie pewien, że jest to problem z łączem, ponieważ mogę zadzwonić z kodem C i popełnić umyślny błąd w wywołaniach funkcji do tej biblioteki, która produkuje wcześniejsze błędy, które wskazują, że prototypy funkcji zostały załadowane i użyte do kompilacji.

Próbowałem dodać lokalizację, która zawiera plik .a do LDFLAGS, a następnie robi AC_CHECK_LIB, ale nie został znaleziony.

Może moja składnia jest zła, a może brakuje mi czegoś bardziej fundamentalnego, co nie byłoby zaskakujące, ponieważ jestem początkującym i nie bardzo wiem, co robię.

Oto co próbowałem:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location"; 
    AC_CHECK_LIB(helper)]) 

Brak kości. AC_CHECK_LIB szuka -lhelper Chyba (lub libhelper?), Więc nie jestem pewien, czy to jest problem, więc spróbowałem tego również (pomiń AC_CHECK_LIB i zawrzyj .a bezpośrednio w LDFLAGS), bez powodzenia:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS -L$location/helper.a"]) 

naśladować ręczną kompilację, próbowałem usunięcie -L ale to nie pomoże:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location"; 
    LDFLAGS="$LDFLAGS $location/helper.a"]) 

próbowałem innych kombinacji i permutacji, ale myślę, że może być coś bardziej fundamentalnego brakuje ....

================ UPDATE

Dostałem go do pracy z twardym kodowane ścieżką do pliku .a w Makefile.am używając _LDADD tak:

myprog_LDADD=/home/john/mystuff/helper.a 

Ale nie mogę przewidzieć lokalizację pliku .a. Z jakiegoś powodu, definiując myprog_LDADD w configure.ac nie działa (chciałbym, żeby tak było, więc mogę użyć mojej zmiennej lokalizacji dynamicznej) i nie wydaje się, żeby kombinacja zmian do LDFLAGS, myprog_LDFLAGS, AM_LDFLAGS działała.

Jeżeli w Makefile.am, próbuję użyć zmiennej lokalizacji, która jest zdefiniowana w configure.ac, to nie działa

myprog_LDADD=($location)helper.a 

============ ==== UPDATE

Myślę, że to wymyśliłem, ale ponieważ nie mam pojęcia, co robię, NAPRAWDĘ doceniam niektóre opinie. Kiedyś AC_SUBST(), aby uzyskać myprog_LDADD pracować z configure.ac, więc ostateczne rozwiązanie wygląda tak:

AC_CHECK_HEADER([$location/helper.h], 
    [AC_DEFINE([HAVE_HELPER_H], [1], [found helper.h]) 
    CFLAGS="$CFLAGS -I$location" 
    myprog_LDADD="$location/helper.a" 
    AC_SUBST(myprog_LDADD)]) 
+0

To bardzo dużo, aby odpowiedzieć na wszystkie naraz. Możesz uzyskać więcej odpowiedzi, jeśli zadałeś jedno pytanie naraz i łatwiej byłoby odczytać, jeśli poprawnie sformatowałeś fragment kodu - prefiks każdej linii czterema spacjami. – ptomato

Odpowiedz

8

Można ustawić lokalizację w configure.ac:

LOCATION=/home/john/mystuff 
AC_SUBST(LOCATION) 

AC_SUBST definiuje zmienną $LOCATION we wszystkich twoich Makefile.am s, a także zastępuje wszystkie wystąpienia @[email protected] z zawartością $LOCATION. Tak więc w Makefile.am można zrobić

myprog_CPPFLAGS="-I$LOCATION" 
myprog_LDADD="$LOCATION/helper.a" 

PS. Powodem, dla którego należy bezpośrednio odwoływać się do biblioteki, jest to, że -l szuka poprawnie nazwanej biblioteki (na przykład libhelper.a) w katalogach biblioteki systemowej. Ponieważ jednak nie ma tak dużej różnicy między biblioteką statyczną a plikiem obiektowym, nie ma potrzeby, aby odwoływać się do niej w magiczny sposób, używając -l; możesz po prostu skompilować go do swojego programu, tak jak robisz to teraz.

+0

OK, dziękuję. Widząc, co zasugerowałeś, wygląda na to, że zrobiłem dokładnie to samo, używając AC_SUBST() do propagowania myprog_LDADD do Makefile. Czy jest coś nie tak z moją metodą w porównaniu do twojej? DZIĘKUJEMY ZA POMOC! !!!!!! – EBM

+0

Dodatkowo, czy jest jakaś przyczyna umieszczenia helper.a w LDFLAGS nie działa, ale dodanie do myprog_LDADD robi? Oczywiście nie rozumiem różnicy między tymi dwoma. Jeszcze raz DZIĘKUJĘ. – EBM

+0

Twoja metoda definiuje myprog_LDADD we wszystkich plikach Makefile, a nie tylko w tym, czego potrzebujesz. Może to potencjalnie powodować problemy. – ptomato

Powiązane problemy