2008-10-16 12 views
36

Mam wspólną bibliotekę, którą chcę połączyć plik wykonywalny przed użyciem GCC. Współużytkowana biblioteka ma niestandardową nazwę nie o nazwie libNAME.so, więc nie mogę użyć zwykłej opcji -l. (Zdarza się też, że jest to rozszerzenie Pythona i nie ma przedrostka "lib".)Jak połączyć za pomocą GCC bez -l ani ścieżki hardcoding dla biblioteki, która nie jest zgodna z konwencją nazewnictwa libNAME.so?

Jestem w stanie przekazać ścieżkę do pliku biblioteki bezpośrednio do wiersza poleceń linku, ale powoduje to, że ścieżka biblioteki jest zakodowane na stałe w pliku wykonywalnym.

Na przykład:

g++ -o build/bin/myapp build/bin/_mylib.so 

Czy istnieje sposób podłączenia się do tej biblioteki, nie powodując ścieżkę być ustalony w pliku wykonywalnego?

Odpowiedz

57

Istnieje ":" prefiks, który pozwala nadać różne nazwy do swoich bibliotek. Jeśli używasz

g++ -o build/bin/myapp -l:_mylib.so other_source_files 

powinien szukać ścieżki dla _mylib.so.

+1

To jest dokładnie to, czego szukałem. Dzięki! – kbluck

+0

Pomogła mi bardzo, dziękuję. –

+2

Zauważyłem, że wynikiem tego jest 'build/bin/_mylib.so' osadzony w bibliotece, która została połączona za pomocą' -l: '- zamiast osadzania samego' _mylib.so', jak to zwykle robi dla standardowych sonames. W rezultacie, podczas próby wczytania '_mylib.so', będzie szukał pełnej ścieżki (' ldd' wyświetliłby ją) i nie znajdzie sam '_mylib.so'. –

2

Jeśli można skopiować współdzieloną bibliotekę do katalogu roboczego po g ++ jest wywołany wtedy to powinno działać:

g++ -o build/bin/myapp _mylib.so other_source_files 
1

Jeśli jesteś na systemie Unix lub Linux myślę, że można utworzyć dowiązania symbolicznego do biblioteki w katalog, w którym chcesz bibliotekę.

Na przykład:
ln -s build/bin/_mylib.so build/bin/lib_mylib.so

Można wtedy użyć -l_mylib

http://en.wikipedia.org/wiki/Symbolic_link

Powiązane problemy