Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[GSL] Instalacja samodzielnie skompilowanej biblioteki.



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
lynxpl



Dołączył: 07 Kwi 2015
Posty: 15
Skąd: Warszawa

PostWysłany: Pią Cze 05, 2015 12:43 pm  OP    Temat postu: [GSL] Instalacja samodzielnie skompilowanej biblioteki. Odpowiedz z cytatem Pisownia

Witajcie ponownie.

Potrzebując użyć jednej z funkcji z GSL (GNU Science Library 1.16), skompilowałem ją sam przy pomocy MSYSa (1.0 wraz z minGW 4.8.1 na Win7 x64) z plików źródłowych do plików bibliotek statycznych (*.a). Jest to moja pierwsza skompilowana samodzielnie biblioteka ever więc poruszam się w tym temacie jak we mgle nie do końca może rozumiejąc jak to działa. Posiłkowałem się instruktażem stąd: link.
Czyli komendy dla MSYSa odpalonego w c/cpplibs/gsl:
Kod:
./configure --prefix=/cpplibs/gsl
make
make -k check > log_check 2>&1

Po dokonaniu pre-kompilacji, zgodnie z powyższą instrukcją, przekopiowałem do /minGW/include folder /gsl z headerami, zaś do minGW/lib/gsl przekopiowałem biblioteki:
Cytat:
libgsl.a
libgsl.dll.a
libgsl-0.dll
libgslcblas.dll.a
libgslcblas-0.dll

No i tu jest klops. Bo kompilator widzi nagłówki (bo jak ich nie widział to pisał wprost o który chodzi), ale nie widzi bibliotek zgłaszając
Cytat:
undefined reference to (dowolny obiekt z GSL, np. "gsl_odeiv2_driver_alloc_y_new")

Próbowałem różnych sztuczek ze wskazywaniem w opcjach projektu/kompilatora ścieżek do folderów gsl/lib i gsl/gsl (headery) ale to na nic.
Czy powinienem, mimo że generalnie biblioteka jest linkowana statycznie, zdefiniować zmienne systemowe dla GSL tak jak tu? Chyba nie-prawda?
Czy powinienem próbować pre-kompilacji z parametrem --disable-shared mimo że bez niego zakończyła się powodzeniem? Ogólnie pytanie brzmi, co zrobiłem nie tak?

PS. Jak widać, wykonałem też test 'make check'. Błędów nie zgłosił. Jedynie jedno niepowodzenie (FAIL) na samym końcu (Pełny log jest tu).
Cytat:
============================================================================
Testsuite summary for gsl 1.16
============================================================================
# TOTAL: 2
# PASS: 1
# SKIP: 0
# XFAIL: 0
# FAIL: 1
# XPASS: 0
# ERROR: 0
============================================================================
See ./test-suite.log
============================================================================
make[3]: *** [test-suite.log] Error 1
make[3]: Leaving directory `/c/cpplibs/gsl'
make[2]: *** [check-TESTS] Error 2
make[2]: Leaving directory `/c/cpplibs/gsl'
make[1]: *** [check-am] Error 2
make[1]: Leaving directory `/c/cpplibs/gsl'
make: *** [check-recursive] Error 1
make: Target `check' not remade because of errors.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Taeril



Dołączył: 20 Cze 2005
Posty: 1249

PostWysłany: Nie Cze 07, 2015 10:33 am      Temat postu: Odpowiedz z cytatem Pisownia

W spisie bibliotek nie widzę libgslcblas.a - nie masz wersji statycznej?
Generalnie projekty korzystające z autotools (te ze skryptem configure) sugeruję konfigurować z --enable-static --disable-shared aby mieć tylko wersję statyczną. Albo na odwrót i tylko dynamiczną.

Teraz masz trzy rodzaje plików.
1. Nagłówki lądują w include i jak masz w podkatalogu, to odpowiednio będzie wyglądać linijka z #include albo będziesz musiał podać dany katalog w -I
Czyli na przykład masz .../mingw/include/gsl/gsl_sf_bessel.h oraz #include <gsl/gsl_sf_bessel.h>
Ale może też być #include <gsl_sf_bessel.h> oraz podany katalog w opcjach kompilatora -I .../mingw/include/gsl/gsl_sf_bessel.h
Oczywiście te trzy kropki powinny być zastąpione właściwym początkiem ścieżki.

2. Pliki dll lądują w bin i albo dołączasz je z programem albo mówisz systemowi gdzie ich szukać. Ale to już mamy w tamtym temacie przedyskutowane.

3. Pliki bibliotek (.a lub .dll.a) lądują bezpośrednio w lib i podajesz w opcjach kompilatora -lfoo dla .../mingw/lib/libfoo.a
Analogicznie do nagłówków jak masz w niestandardowym miejscu potrzebujesz podać dodatkowy katalog w opcjach kompilatora aby wiedział gdzie ma szukać bibliotek. A więc dla .../mingw/lib/gsl/libgsl.a w opcjach kompilatora podasz -L.../mingw/lib/gsl -lgsl
Jeszcze zamiast pary -L -l możesz podać pełną ścieżkę do pliku .a



Skoro wywala się na etapie linkowania, to kod się skompilował więc nagłówki masz OK.
Linker nie znajduje symboli biblioteki a więc powiedz jak poinformowałeś kompilator gdzie ich szukać. (punkt 3)


Odnośnie zmiennych systemowych to ich nie potrzebujesz. Może jak masz pliki .pc w niestandardowych miejscach, to była jakaś dla pkg-config ale jak wrzucasz wszystko w odpowiednie miejsca (include/lib/bin), to powinno wszystko po prostu działać.


Pisane trochę na kolanie i z generalnego punktu widzenia (nie próbowałem instalować tej biblioteki) ale może coś pomoże

_________________
T.

"Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems." - Jamie Zawinski
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
lynxpl



Dołączył: 07 Kwi 2015
Posty: 15
Skąd: Warszawa

PostWysłany: Pon Cze 08, 2015 10:39 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

libgslcblas.a mam w wersji statycznej. Omsknęła się przy przepisywaniu.
Includuje "na ostro":
Kod:
#include <gsl/gsl_errno.h>
#include <gsl/gsl_odeiv2.h>

---edit---
OK. Udało mi się w końcu rozwiązać ten problem.
Mając rozmieszczenie plików jak niżej:
../cpplibs/mingw/include/gsl ->wszystkie headery;
../cpplibs/mingw/lib
Cytat:
libgsl.a
libgslcblas.a
libgslcblas.dll.a
libgsl.dll.a

../cpplibs/mingw/bin
Cytat:
libgsl-0.dll
libgslcblas-0.dll

../cpplibs/gsl ->pozostałe pliki *.a konkretnych funkcji jakie powstały podczas pre-kompilacji w swoich oryginalnych podfolderach.

Dodałem następujące pragmy w "komendach linkera" projektu, wedle instrukcji GSL:
Cytat:
-L ../cpplibs/mingw/lib
-lgsl
-lcblas
-lm


Program zatrybił- skompilował się i coś pokazał. Dzięki jeszcze raz Taeril za naprowadzenie na źródło problemu.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.02342 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |