MySQL 5.7에서 기하연산(GIS)을 위해 Boost 라이브러리의 Geometry를 사용.


5.6에서는 자체 구현을 했지만 간혹 발생하는 이상한 케이스에 대해서 하나씩 수정할지 기존 알고리즘을 선택할지 고민하다가 Boost의 Geometry를 사용하는 것을 선택.


MySQL 커뮤니티는 단순하게 Boost.Geometry를 소비하는 것만이 아닌 앞으로 공헌해 나갈 것을 알림.

Boost.Geometry를 더 좋게 만들기 위해서 MySQL 개발자 2명이 풀 타임으로 활동.

저작자 표시
신고
by 흥배 2014.05.13 08:00

소스 코드: hello-boost.cpp

#include <boost/regex.hpp>

#include <iostream>

#include <string>



int main()

{

std::string line;

boost::regex pat("^Subject: (Re: |Aw:)*(.*)");


while(std::cin)

{

std::getline(std::cin, line);

boost::smatch matches;


if(boost::regex_match(line, matches, pat))

std::cout << matches[2] << std::endl;

}


return 0;

}



Makefile

CXX=clang++

CXXFLAGS=-I/home/dev/Dev/C++/boost

LDFLAGS=-L/home/dev/Dev/C++/boost/stage/lib

LDLIBS=-lboost_regex


all:hello-boost


clean:

rm -rf hello-boost

rm -rf *.o





저작자 표시
신고
by 흥배 2014.01.29 08:00

리눅스에서는 기본 옵션이 아래처럼 된다.

link=static,shared threading=multi variant=release


본인은 아래와 같이 빌드했다. 

(OpenSUSE가 64비트라 그런지 기본으로 64비트로 빌드 되었다._

./bootstrap.sh

./b2 toolset=clang link=static,shared cxxflags="-std=c++11 -stdlib=libstdc++" linkflags="-stdlib=libstdc++" threading=multi


저작자 표시
신고
by 흥배 2014.01.27 08:00

VC용으로 빌드된 Boost 라이브러리 Lib 파일을 제공하고 있는걸 근래에 알았다.

받을 수 있는 위치는 http://sourceforge.net/projects/boost/files/boost-binaries/  이다.

Boost 라이브러리의 다양한 버전 및 VC의 버전별로 준비 되어 있다.




1.55 버전은 여기에 있다. http://sourceforge.net/projects/boost/files/boost-binaries/1.55.0/

참고로 VC 12버전과의 호환성에 문제가 있어서 일부 라이브러리는 빌드 되지 않았다고 한다.

저작자 표시
신고
by 흥배 2014.01.22 08:00

사용법 및 소개 http://ikpil.com/1057 
(일본어) https://sites.google.com/site/boostjp/tips/scope_guard 
(일본어) C++11 람다 대응 http://d.hatena.ne.jp/faith_and_brave/20111125/1322199381 
(일본어) this 캡쳐하기 http://d.hatena.ne.jp/faith_and_brave/20120703/1341298054 


  • 스코프 내의 모든 변수를 캡쳐하기(C++11 전용)

BOOST_SCOPE_EXIT_ALL을 사용한다. 클래스의 멤버 변수도 사용할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CPacketSend kPacketSend( SAD_REP_CHECK_ACCOUNT );
BYTE nErrorCode = E_SAI_REP_CHECK_ACCOUNT::FLAG_CHECK_OK;
     
BOOST_SCOPE_EXIT_ALL(&)
{
    if( nErrorCode != E_SAI_REP_CHECK_ACCOUNT::FLAG_CHECK_OK )
    {
    kPacketSend << nErrorCode;
    kPacketSend << nClientSocketIndexInLoginServer;
    kPacketSend << dwLoginUniqueSocketID;
    kPacketSend << iLoginServerNumber;
    GET_NETWORK_INTERFACE()->SendToServer( iServer, kPacketSend);
    }
};
  • BOOST_SCOPE_EXIT를 사용할 때 조심할 점

이것을 사용하는 스코프 내에서 BOOST_SCOPE_EXIT를 정의하기 전에 return 문을 사용하면 안된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
void Check()
{
   ...........
   if( ... )
   {
     return;
   }
 
   // 아래가 호출되지 않는다
   BOOST_SCOPE_EXIT_ALL(&)
   {
   }
}

올바르게 사용하려면 아래와 같이 바꾸어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Check()
{
   ...........
   // 아래가 호출되지 않는다
   BOOST_SCOPE_EXIT_ALL(&)
   {
   }
    
   ....
   if( ... )
   {
     return;
   }
 
    
}


저작자 표시
신고
by 흥배 2013.09.10 08:00

Boost 라이브러리는 home에서 아래의 디렉토리에 설치



Boost 라이브러리를 빌드하여 debug, release 각각 만든다(정적 라이브러리)

빌드 방법은 다음 http://jacking.tistory.com/1070


tesp.cpp와 Makefile을 TestCppBoost 디렉토리에 생성


소스코드


Makefile


빌드 후 실행


저작자 표시
신고
by 흥배 2013.09.04 08:00

예전에는 Windows의 개발자가 Linux에서 C++ 프로그램을 개발하는 것이 쉽지 않았다. 쉽지 않은 이유는 Visual C++과 같은 툴이 없기 때문이었다.


그러나 요즘은 이클립스나 KDevelop, MonoDevelop를 사용할 수 있어서 예전 보다 엄청 좋아졌다.


MonoDevelop를 사용하여 Boost 라이브러리의 thread 라이브러리를 사용한 C++ 프로그램을 빌드하는 방법을 간단하게 설명한다.


컴파일러는 g++을 사용하고, Boost 라이브러리는 빌드 된 상태이다.


MonoDevelop를 사용하여 C++ 프로젝트를 만든 후 아래의 코드를 코딩한다.


아래 그림의 팝업 메뉴에서 'Option'을 선택하여 프로젝트 설정을 한다.


Boost 라이브러리의 헤더 파일과 lib 파일의 디렉토리를 추가한다


사용할 lib 파일을 추가한다


Boost 라이브러리의 디렉토리는 다음과 같다


스레드를 사용하므로 옵션으로 -pthread 를 추가한다


이제 빌드하면 된다!!!


저작자 표시
신고
by 흥배 2013.08.19 08:00

리눅스 플랫폼에서 C++ 프로그래밍을 쉽게 하는 방법은 Eclipse라는 IDE를 사용하면 좋다.

그러나 VS를 사용했던 프로그래머로서는 사용해 보면 초반부터 간단한 부분에서 막혀서 스트레스를 받는데 이중 몇 가지를 기록 차원에서 간단하게 정리한다.


프로젝트 설정을 위해서는 아래의 설정 창을 열어야 한다.


C++11 사용하기

아래 처럼 -std=c++11 을 입력한다(참고로 gcc 4.8 사용)

* 참고  

Eclipse 에서 MinGW GCC 컴파일러로 C++11 사용하기

http://blog.powerumc.kr/404


외부 해더 파일 설정


외부 lib 파일 설정

여기서 주의할 점은 아래와 같이 이름이 libboost_reggex.a 라는 lib 파일을 설정에 등록할 때는 앞의 'lib'과 뒤의 '.a'를 제외하고 입력해야 한다.

*참고

eclipse에서 boost 사용하는데 에러가 난다..

http://abipictures.tistory.com/821


How to Install, Build and Use the Boost C++ libraries for development with the Eclipse IDE using the MinGW compiler on a Windows Platform 

http://theseekersquill.wordpress.com/2010/08/24/howto-boost-mingw/



std::thread 사용

아래처럼 '-pthread' 를 입력한다.

* 참고

How to make CDT/Eclipse work with C++11 threads?

http://stackoverflow.com/questions/10395936/how-to-make-cdt-eclipse-work-with-c11-threads



Eclipse는 VS와 다르게 빌드할 때 소스를 자동으로 저장하지 않는다.

그래서 코딩 후 저장하지 않고 빌드하면 빌드 실패가 발생한다.

빌드할 때 자동 저장을 하기 위해서는 아래의 옵션을 체크한다.

출처: http://stormcoding.tistory.com/6



저작자 표시
신고
by 흥배 2013.08.15 08:00

지금의 C++ 표준은 03 이 아닌 C++11 이다. 새로운 시대에 맞게 Asio 프로그래밍을 할 때 C++11 표준을 사용하는 것이 좋다.

 

C++03 표준을 사용하여 Asio를 사용할 때는 AsioAccept, Send, Receive 등의 비동기 함수에 완료 함수를 등록할 때 boost::bind를 사용하였지만 C++11 에서는 lambda를 사용한다.

 

Asio에서 리모트의 접속을 받아들이는 함수 async_accept C++03에서는 아래와 같은 방식으로사용했다.

 

boost::asio::ip::tcp::acceptor m_acceptor;

 

void handle_accept(Session* pSession, const boost::system::error_code& error)

{

if (!error)

{     

       std::cout << "클라이언트 접속 성공" << std::endl;

                   

       pSession->PostReceive();

}

}

 

m_acceptor.async_accept( m_pSession->Socket(),

                    boost::bind(&TCP_Server::handle_accept,

                           this,

                           m_pSession,

                           boost::asio::placeholders::error)

                    );

 

위의 코드를 C++11 방식으로 바꾸면 아래와 같다.

m_acceptor.async_accept( m_pSession->Socket(),

                     [this](boost::system::error_code error)

                    {

                       if (!error)

                       {  

                          std::cout << "클라이언트 접속 성공" << std::endl;

                          m_pSession->PostReceive();

                       }

                      

                       StartAccept();

                    }

                    );

 

 

 

저작자 표시
신고
by 흥배 2013.08.12 08:00

Visual Studio 2013 Preview에서 Boost 라이브러리 1.54 버전의 Asio 라이브러리를 사용하면 빌드 실패가 발생합니다.


이유는 std::min 알고리즘 때문입니다.

Boost.Asio lacks algorithm header include for std::min https://svn.boost.org/trac/boost/ticket/8758 The <algorithm> header providing std::min is not included in boost/asio/detail/impl/win_iocp_io_service.hpp, this breaks on Visual Studio 2013 Preview due to library changes.

http://www.marshut.com/qskts/patch-bonanza-for-vs2013-preview-support.html


일단 해결 방법은 있습니다. 아마 정식 해결은 1.55 버전까지 기다려야 할 것 같습니다.

(VS2013 정식 버전이 나올 때쯤에는 1.55 버전 나올 듯 하네요)


https://svn.boost.org/trac/boost/ticket/8758


저작자 표시
신고
by 흥배 2013.07.29 08:00
| 1 2 3 4 5 6 |

티스토리 툴바