2010-02-24 17 views
10

Używam biblioteki Boost w systemie Linux, GCC. Po zainstalowaniu i zbudowaniu Boosta odkryłem, że programy używające Regex i Thread korzystają z bibliotek Boost. Do moich celów potrzebuję statycznego linkowania. Jak zmienić typ połączenia? Czy powinienem odbudować Boost, czy może mogę ustawić typ łączenia przez zdefiniowanie stałej w moich własnych projektach lub w plikach konfiguracyjnych Boost?Zwiększanie statycznego łączenia

Odpowiedz

17

Wystarczy dodać -static do inwokacji budowania. Oto krótki przykład sesja:

$ cat boost_formatted_time.cpp 
#include <iostream> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/posix_time/posix_time_io.hpp> 

using namespace boost::posix_time; 
using namespace std; 

int main(int argc, char **argv) { 
    time_facet *facet = new time_facet("%d-%b-%Y %H:%M:%S"); 
    cout.imbue(locale(cout.getloc(), facet)); 
    cout << second_clock::local_time() << endl; 
} 
$ g++ -o /tmp/bft_dyn boost_formatted_time.cpp -lboost_date_time 
$ g++ -static -o /tmp/bft_stc boost_formatted_time.cpp -lboost_date_time 
$ ls -lh /tmp/bft_* 
-rwxr-xr-x 1 edd edd 216K 2010-02-24 12:34 /tmp/bft_dyn  
-rwxr-xr-x 1 edd edd 1.5M 2010-02-24 12:34 /tmp/bft_stc  
$ /tmp/bft_dyn 
24-Feb-2010 12:34:55 
$ /tmp/bft_stc 
24-Feb-2010 12:34:59 
$ 

Uwaga, w jaki sposób statyczny binarny jest 1.5MB w przeciwieństwie do 216KB dla dynamicznie połączonego wariantu. Wszystko odbywa się na testach Debiana z domyślnymi pakietami boost.

+1

Nie uruchamiam gcc z wiersza poleceń, używam Eclipse CDT. Prawdopodobnie -statyczny przełącznik można przekazać linkerowi z Ustawień projektu, postaram się znaleźć w ten sposób. Dziękuję Ci. –

+0

Czy '-static' ma wpływ na wszystkie biblioteki, jeśli zawiera więcej niż 1 bibliotekę? – mrgloom

0

Podaj -Lpath/to/library/ do linkera.

+0

Nie mam żadnych problemów z budową projektu i ścieżką do biblioteki, wystarczy zmienić typ połączenia: z dynamicznego na statyczny. –

+6

To nie jest poprawne - potrzebujesz '-static'. '-L' podaje lokalizację biblioteki, ale nie jest typem połączenia. Zobacz moją odpowiedź na pełną sesję. –

Powiązane problemy