C++ : testing boost c++


Pertanyaan yang paling awal adalah...apa itu boost? Akhir-akhir ini saya browsing di stackoverflow sering mendapati member-member disana memberikan saran implementasi boost ini untuk jawabannya, sampai-sampai ada yang menanyakan seperti ini. yak, langsung saja boost adalah external library untuk c++, yang konon sudah teruji dan berkualitas tinggi. Lebih lengkapnya cek di websitenya sendiri.

Kali ini, saya akan mengetes boost dengan source code dari  websitenya sendiri, bisa di cek disini. Tentu saja sebelum mengcompile source codenya, langkah pertama  librarynya sendiri harus terlebih dahulu di download, testing kali ini saya memakai boost versi 1.16.0 versi unix (karena saya memakai linux ubuntu). Compilernya saya memakai gcc dengan versi :
~$ gcc --version
gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Setelah terdownload, library yang masih dalam bentuk file *.tar.gz di ekstrak ke direktori yang diinginkan (dalam pengetesan kali ini saya menaruhnya di direktori home = /home/user/). Setelah di ekstrak sebenarnya pekerjaan kita sudah hampir selesai karena library boost kebanyakan hanyalah header semata, tapi ada beberapa juga yang butuh penginstalan dengan menjalankan script yang sudah di sediakan di package yang sudah didownload tadi. Ok, sekarang saatnya mengcompile source codenya. Untuk mengindikasikan bahwa kita sukses menjalankan program dari source code ini, saya merubah sedikit source code dari website asalnya menjadi :
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
    using namespace std; // For time_t, time and ctime;
    time_t now = time(0);
    return ctime(&now);
}

int main()
{
    try
    {
        boost::asio::io_service io_service;

        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));
        std::cout << "hay" << std::endl;

        for (;;) {
            tcp::socket socket(io_service);
            acceptor.accept(socket);

            std::string message = make_daytime_string();

            boost::system::error_code ignored_error;
            boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }

    return 0;
}
Ya, ada tambahan std::cout << "hay" << std::endl; disana. Untuk itu untuk mengcompile source codenya, kita jalankan perintahnya seperti di bawah dan hasilnya adalah :
~$ g++ -I/home/ryan/boost boost.cpp -o boos
/tmp/ccpIxC7k.o: In function `__static_initialization_and_destruction_0(int, int)':
boost.cpp:(.text+0x2f0): undefined reference to `boost::system::generic_category()'
boost.cpp:(.text+0x2fc): undefined reference to `boost::system::generic_category()'
boost.cpp:(.text+0x308): undefined reference to `boost::system::system_category()'
/tmp/ccpIxC7k.o: In function `boost::system::error_code::error_code()':
boost.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x17): undefined reference to `boost::system::system_category()'
/tmp/ccpIxC7k.o: In function `boost::asio::error::get_system_category()':
boost.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference to `boost::system::system_category()'
collect2: error: ld returned 1 exit status
Yup, ternyata error dan ternyata setelah searching-searching diketahui bahwa perlu di masukkan lagi dynamic library dalam command g++ yang sebelumnya di jalankan yaitu, libboost_system.so. Oleh karena itu command yang d jalankan menjadi seperti di bawah dan menghasilkan :
~$ g++ -I /home/ryan/boost boost.cpp -L/home/ryan/boost/stage/lib -lboost_system -o boos
~$
Dan sukses, sekarang ayo kita jalankan :
~$ sudo ./boos
[sudo] password for ryan:
./boos: error while loading shared libraries: libboost_system.so.1.61.0: cannot open shared object file: No such file or directory

Yup, ada masalah lagi...program kita bingung dimana harus mencari shared libraries yang di butuhkan untuk menjalankan program kita karena shared libraries yang kita pakai kali ini berasal dari luar bukan dari dalam seperti yang biasanya. Untuk mengatasi itu, perlu untuk mengcreate file conf baru di direktori /etc/ld.so.conf.d. Penamaan file conf yang di butuhkan bebas, asalkan dia berada di /etc/ld.so.conf.d/. Didemo kali ini, perintah yang di gunakan di terminal :
/etc/ld.so.conf.d$ sudo nano boost.conf
  GNU nano 2.5.3              File: boost.conf                                 

# boost configuration
/home/ryan/boost/stage/lib

















                                [ Read 2 lines ]
^G Get Help  ^O Write Out ^W Where Is  ^K Cut Text  ^J Justify   ^C Cur Pos
^X Exit      ^R Read File ^\ Replace   ^U Uncut Text^T To Spell  ^_ Go To Line
kemudian perintah lagi :
/etc/ld.so.conf.d$ sudo ldconfig
Dan terakhir ayo kita jalankan kembali programnya :
~$ sudo ./boos
hay
Yeah, akhirnya sukses. Harus pakai sudo agar programnya bisa di jalankan dan teks "hay" disini indikasi bahwa programnya sukses berjalan, misi selesai. Seandainya anda tidak ingin repot-repot create file conf yang tadi (walaupun create filenya tidak merepotkan sama sekali) maka untuk menjalankan programnya, perintahnya menjadi :
sudo LD_LIBRARY_PATH=/home/ryan/boost/stage/lib ./boos
Silahkan bandingkan mana yang lebih praktis. Sekian testing kali ini, jika ada kesalahan, kritik, atau saran tolong sampaikan di kolom komentar.

refrensi:
http://www.boost.org/
http://www.boost.org/doc/libs/1_61_0/more/getting_started/unix-variants.html
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/tutorial/tutdaytime1/src.html
http://gamedev.stackexchange.com/questions/8980/why-dont-c-game-developers-use-the-boost-library
http://stackoverflow.com/questions/9151491/extending-default-lib-search-path-in-ubuntu
http://serverfault.com/questions/201709/how-to-set-ld-library-path-in-ubuntu

Komentar