C++, boost, kompilacja nie powodzi się


(matiit) #1

Chciałem nauczyć się wykorzystywać obce biblioteki. Wybór na początek padł na boost. Niestety:

#include "boost/filesystem.hpp"

#include 

namespace fs = boost::filesystem;

int main(){

	if ( !fs::exists( "plik.txt" ) )

		std::cout << "plik.txt istnieje" << std::endl;

}

g++ plik.cpp 

/tmp/cctYlkxo.o: In function `__static_initialization_and_destruction_0(int, int)':

plik.cpp:(.text+0xa6): undefined reference to `boost::system::get_system_category()'

plik.cpp:(.text+0xb2): undefined reference to `boost::system::get_generic_category()'

plik.cpp:(.text+0xbe): undefined reference to `boost::system::get_generic_category()'

plik.cpp:(.text+0xca): undefined reference to `boost::system::get_generic_category()'

plik.cpp:(.text+0xd6): undefined reference to `boost::system::get_system_category()'

/tmp/cctYlkxo.o: In function `boost::system::error_code::error_code()':

plik.cpp:(.text._ZN5boost6system10error_codeC1Ev[boost]+0x17): undefined reference to `boost::system::get_system_category()'

/tmp/cctYlkxo.o: In function `boost::enable_if, std::allocator >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists, std::allocator >, boost::filesystem::path_traits> >(boost::filesystem::basic_path, std::allocator >, boost::filesystem::path_traits> const&)':

plik.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost]+0x46): undefined reference to `boost::filesystem::detail::status_api(std::basic_string, std::allocator > const&, boost::system::error_code&)'

collect2: ld returned 1 exit status

Co robię nie tak?


(Sawyer47) #2

Jak zainstalowałeś Boost? Po include "boost/filesystem.hpp" można stwierdzić, że pobrałeś źródła ze strony raczej niż gotowe paczki dla dystrybucji (chyba że używasz Windows). Nie wszystkie biblioteki z Boost mieszczą się tylko w plikach nagłówkowych, część trzeba zbudować... zrobiłeś to zgodnie z instrukcjami na boost.org? Bo właśnie Boost.System jest jedną z tych bibliotek, która wymaga zbudowania.


(matiit) #3

Racja. zmieniłem "" na <>. Nagłówki mam w /usr/include.

Co w moim przypadku będzie "boost root diretory"?


(Sawyer47) #4

Skoro masz w /usr/include instalowane z jakiejś paczki(?), czyli poprawne zainstalowane to wystarczy:

g++ plik.cpp -lboost_filesystem // lub -lboost_filesystem-mt

// wcześniej miałem nazwy bez -mt, teraz spróbowałem i trzeba z -mt, szczerze nie mam pojęcia czemu ;)

SOA#1 pod Ubuntu, Boost 1.37.0 z paczek.


(matiit) #5

Tak działa. Ślicznie dziękuję. A można gdzieś poczytać o przełącznikach -l*?


(Sawyer47) #6

Tu: http://gcc.gnu.org/onlinedocs/gcc-4.4.0 ... nk-Options ?


(matiit) #7

Dzięki nr47.