'vc++'에 해당되는 글 3건

  1. 2010.03.17 boost library 설치
  2. 2010.03.15 libcurl 사용하기
  3. 2009.09.03 ACE(ADAPTIVE Communication Environment)
 자바는 하드웨어 접근이 원칙적으로 통제되어 있으므로 표준 API에서 지원하지 않는 기능을 사용하기 위해서는 네이티브 바이너리에 직접 접근해야만 한다. 이 제한은 플랫폼 독립적이어야 하는 자바의 원칙을 깨는 것이므로, 자바가 좀 더 많은 일을 할 수 있게 하기 위해 표준 API안에 개발에 필요한 가능한한 많은 기능들을 제공해야 했다. 덕분에 자바 개발자들은 네트워킹, 쓰레드, DB접근, GUI등 애플리케이션 개발에 필수적인 요소들에 객체지향적으로 잘 설계된 방대한 라이브러리를 자유롭게 사용할 수 있다.

 반면에, C++은 언어와 API가 별개이다. C++에서는 시스템에 관련된 API는 플랫폼 개발자가 제공하는 것이 원칙이므로, 플랫폼 독립적인 방법을 제공하기 위해 표준 API의 어휘를 늘리는 것에 적극적이지 않았다. 그 결과 iostream과 stl을 제외하자면 객체지향으로 설계된 API가 없는 거나 다름없는 빈약한 언어가 되었고, 나머지는 모두 플랫폼 개발자가 제공하는 라이브러리에 의존해야 했다.

 C++로 응용프로그램을 개발할 때, 사소하지만 빈번하게 사용되는 유틸리티들마저 부족한 것은 큰 문제이다. 달력이나 유리수 표현과 같은 유틸리티는 어지간한 입문서에서 단골로 다룰 만큼 작은 라이브러리지만, 표준이 없으므로 필요할 때마다 계속 "바퀴를 다시 발명하여"사용해야만 한다.

 boost는 이런 문제의식을 배경으로, 범용으로 빈번하게 사용되는 작은 유틸리티들을 제공하려는 프로젝트이다. 그래프, 쓰레기 수집 기능을 가진 포인터, 파일시스템, 수학 연산들, 쓰레드, 스캐너와 LL파서 등 유용한 기능을 가진 라이브러리들을 많이 확보하고 있다.

 boost는 다섯 달에 한 번 꼴로 버전업이 이루어지는데, 매 버전업마다 많은 라이브러리가 추가된다. 진보적인 C++문법을 사용하는 관계로 컴파일러와 플랫폼에 따라 성공적으로 컴파일되지 않는 라이브러리가 있을 수 있으니 테스트 결과를 참고해서 사용해야 한다. 지속적으로 포팅이 이루어지고 있으니 컴파일 실패율은 계속 낮아질 것으로 보인다. 너무 활발하게 진행되는 프로젝트이다 보니 버전업이 되면서 하위호환성이 보장되지 않는 경우가 있으므로 주의해야 한다.

boost 공식 사이트: http://www.boost.org/


1. boost 설치
 boost library는 c++의 template를 이용한 구현이 많은데, 이러한 기능들은 *.lib파일이 필요없이 헤더파일(*.hpp)만 있으면 사용할수 있다.(c++의 template는 선언과 구현을 헤더파일와 구현파일로 구분하는 것을 허용하지 않기 때문에, 선언과 구현이 모두 hpp 파일안에 존재한다.) boost는 또한 컴파일이 필요한 라이브러리를 제공하며 선택으로 빌드하여 사용할 수 있다.

boost의 설치를 손쉽게 해주는 툴이 아래 사이트에서 제공된다.


위 사이트에서 제공하는 boost 최신 버전 설치파일을 다운로드한다.

다운로드받은 파일을 실행해 사용하는 Visual Studio의 버전에 따라 아래와 같은 순서로 boost를 설칠할수 있다.

boost에서 제공하는 많은 컴포넌트(컴파일이 필요한)를 필요에 따라 선택해 설치할수 있다.


설치를 성공적으로 마치면 아래 그림과 같이 inclide디렉터리(boost 디렉터리)와 lib디렉터리를 확인할수 있다.


위 그림처럼 include 디렉터리에는 hpp파일들이 기능에 따라 정리되어 세부 디렉터리에 저장되어 있다.
asio 관련 파일을 링크시키자 한다면 #include <boost/asio/ssl.hpp>와 같이 링크할수 있다.


위 그림처럼 lib 디렉터리에는 컴파일된 lib파일이 있다.


2. 네이밍
lib파일들은 mt, gd와 같은 prefix가 붙는데 boost library에 대한 네이밍 규칙은 다음과 같다.

lib
MS Windows 플랫폼을 제외하고 모든 boost라이브러리는 이 string으로 시작된다. 단, MS Windows에서는 static library만 해당 prefix를 사용한다.

boost_regx
라이브러리 이름으로 모든 boost라이브러리의 파일명은 boost_ 로 시작된다.

-vc90
boost를 빅하는데 사용된 툴과 버전을 알려준다.

-mt
라이브러리가 멀티쓰레딩을 지원하는지 알려준다. -mt는 멀티쓰레딩을 지원하도록 빌드됬음을 의미힌다.

-d
빌드 옵션에 따라, 아래와 같은 추가 문자가 붙거나 빠진다.

 Key  Use this library when:
 s  linking statically to the C++ standard library and compiler runtime support libraries. 
 g  using debug versions of the standard and runtime support libraries.
 y  using a special debug build of Python.
 d  building a debug version of your code.
 p  using the STLPort standard library rather than the default one supplied with your compiler.
 n  using STLPort's deprecated “native iostreams” feature.8

-1_42
boost의 버전명.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

spring-data에서 redis 사용하기  (0) 2012.12.06
Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
Posted by devop

댓글을 달아 주세요

curl은 데이터 전송과 관련된 프로그램의 빠른 작성을 위해서 사용하는 command line tool입니다.
HTTP, FTP, LDAP, TELNET, HTTPS, DICT와 같은 프로토콜을 지원하며, SSL을 가지는 각각의 프로토콜 역시 지원합니다.
또한 HTTP기반의 upload, proxies, cookies, user+password 인증을 사용할 수도 있습니다.

이러한 툴의 제공과는 별도로 위의 프로토콜들을 지원하는 클라이언트의 제작을 도와주기 위한 libCURL을 제공합니다.
libCURL을 이용하면 데이터 전송과 관련된 프로그램을 빠르게 작성할 수 있습니다.

다운로드 : http://curl.haxx.se/


1. VC++에 설치하기
위 사이트에서 다운로드를 받은 압축파일을 풀면 아래 그림과 같이 dsw파일이 있는 것을 확인할수 있습니다.
(dsw파일은 비쥬얼 스튜디오 6.0의 워크스페이스 파일입니다.)


워크스페이스를 열면 아래와 같이 2개의 프로젝트가 존재하는데, libcurl을 빌드하면 라이브러리 파일을 얻을수 있습니다.
별도의 준비과정없이 바로 프로젝트가 빌드됩니다.


빌드가 완료되면 DLL-Debug(또는 DLL-release) 폴더 안에,  아래 그림과 같이 lib와 dll파일이 생성됩니다.
(디버그의 경우 postfix로 d가 붙습니다.)




2. 프로젝트에 링크하기
프로젝트의 추가 라이브러리 디렉터리에 위에서 빌드한 lib와 dll파일이 위치한 경로를 입력하고, 추가 종속성으로 lib파일명 을 입력한 후, libcurl의 헤더파일을 추가합니다.

아래 그림과 같은 헤더파일은 include 디렉터리 안에 존재합니다.




3. 예제 코드
프로젝트 셋팅이 완료되었으면 아래와 같은 예제 코드를 작성해 실행할 수 있습니다.
#include "stdafx.h"
#include <iostream>

#include "curl/curl.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	curl_global_init(CURL_GLOBAL_ALL);
	
	CURL *ctx = curl_easy_init();
	if( ctx == NULL ) {
		cout << "Unable to initialize cURL interface" << std::endl;
		return -1;
	}
	
	curl_easy_setopt(ctx, CURLOPT_URL, "http://www.daum.net");
	curl_easy_setopt(ctx, CURLOPT_NOPROGRESS, 1);

	curl_easy_setopt(ctx, CURLOPT_WRITEHEADER, stdout);
	curl_easy_setopt(ctx, CURLOPT_WRITEDATA, stdout);

	const CURLcode rc = curl_easy_perform(ctx);
	if( rc != CURLE_OK ) {
		cout << "Error from cURL: " << curl_easy_strerror(rc) << std::endl;
		return -1;
	}
	else {
		double statDouble;
		long statLong;
		char *statString = 0;

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_HTTP_CODE, &statLong) ) {
			cout << "Response code:  " << statLong << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_CONTENT_TYPE, &statString) ) {
			cout << "Content-Type:  " << statString << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_SIZE_DOWNLOAD, &statDouble) ) {
			cout << "Download size:  " << statDouble << endl; 
		}

		if( CURLE_OK == curl_easy_getinfo(ctx, CURLINFO_SPEED_DOWNLOAD, &statDouble) ) {
			cout << "Download speed:  " << statDouble << endl; 
		}

	}
	
	curl_easy_cleanup(ctx);
	curl_global_cleanup();
	return 0;
}
보다 자세한 내용은 아래 페이지에서 확인할 수 있습니다.

'프로그래밍 > 오픈소스' 카테고리의 다른 글

Hibernate @NotFound 어노테이션  (0) 2012.12.05
이클립스에 GlassFish 설치하기  (0) 2011.02.17
SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
Posted by devop
TAG c++, CURL, HTTP, vc++

댓글을 달아 주세요

1. 개요
ADAPTIVE Communication Environment(ACE)는 네트웍 어플리케이션에서의 동시성(Concurrent)과 I/O를 효율적이고 유연하게 제어하기 위한 많은 핵심 패턴들을 제공해주는 오픈소스 기반 크로스 플랫폼 C++ 객체지향 프레임워크 입니다.

(The ADAPTIVE Communication Environment (ACE) is a freely available, open-source object-oriented (OO) framework that implements many core patterns for concurrent communication software. ACE provides a rich set of reusable C++ wrapper facades and framework components that perform common communication software tasks across a range of OS platforms. The communication software tasks provided by ACE include event demultiplexing and event handler dispatching, signal handling, service initialization, interprocess communication, shared memory management, message routing, dynamic (re)configuration of distributed services, concurrent execution and synchronization.)

ACE에 의해 제공되는 네투웍 소프트웨어 기능들은 다음과 같습니다.

  • 이벤트 다중수신 (event demultiplexing)
  • 이벤트 핸들러 디스페칭 (event handler dispatching)
  • 시그널 핸들링 (signal handling)
  • 서비스 초기화 (service initialization)
  • 프로세스간 통신 (interprocess communication)
  • 공유메모리 관리 (shared memory management)
  • 메세지 라우팅 (message routing)
  • 분산 서비스들에 대한 동적 (재)설정 (dynamic (re)configuration of distributed services)
  • 동시실행과 동기화 (concurrent execution and synchronization) 

ACE는 고성능 실시간 통신 서비스와 어플리케이션을 개발하는 데에 촛점이 맞춰져 있습니다. 이것은 프로세스간 통신, 이벤트 다중수신, 명시적 동적 링킹, 동시처리방식의 객체지향 네트워크 어플리케이션과 서비스의 개발을 단순하게 만들어줍니다. 이에 더하여 ACE는 시스템 설정과 동적으로 연결된 서비스들에 의한 실시간 재설정, 프로세스와 쓰레드상에서 서비스들을 실행하는 것을 자동화해주기 까지 합니다.

원문 링크: http://www.cs.wustl.edu/~schmidt/ACE-overview.html



2. ACE 빌드하기
먼저 ACE의 공식 사이트에서 ACE를 다운로드 받습니다. 다운로드 받은 파일을 압축을 풀고 내용은 보면 아래와 같은 화면을 볼 수 있습니다.


ace라는 폴더로 들어가 아래와 같이 config.h라는 파일을 추가해 줍니다.


config.h파일은 내용은 다음과 같습니다.
//#define ACE_AS_STATIC_LIBS 1
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
//#define ACE_NO_INLINE 1
#include "ace/config-win32.h"
ACE_AS_STATIC_LIBS는 ACE를 정적 라이브러리로 빌드할때 필요한 플래그 입니다.
ACE를 STL과 함께 사용하기 위해 ACE_HAS_STANDARD_CPP_LIBRARY 플래그를 정의합니다.
ACE_NO_INLINE 는 메소드 인라인처리를 무효화하기 위한 플래그 입니다.
config.h파일에서 include하는 파일은 빌드 시스템에 따라 다른데 여기서는 Windows에서 빌드하므로 config-win32.h를 추가합니다.
다시 상위폴더로 돌아와 Visual Studio 솔루션 파일을 열어 소스코드를 빌드할 준비를 합니다.
예제에서는 ACE_vc8라는 솔루션 파일을 오픈합니다.(프로젝트가 엄청 많아서 솔루션을 오픈하는데도 상당한 시간이 걸립니다.)
솔루션 파일을 열면 아래 그림과 같은 많은 프로젝트가 존재하는데 가장 위에서 ACE라는 프로젝트를 발견할 수 있습니다.
자 이제 ACE프로젝트를 빌드하면 됩니다.
빌드가 성공적으로 이루어지면 아래 그림과 같이 lib라는 폴더에 공유라이브러리가 성공적으로 생성된 것을 확인할 수 있습니다.
(d접미사가 붙은 라이브러리는 디버그용임을 나타냅니다.)

3.  ACE에 대한 개인적인 느낌
ACE는 크로스플랫폼 시스템 어플리케이션을 개발하는데 많은 도움을 줄 수 있는 매우 유용한 프레임워크 입니다. ACE는 운영체제의 다양한 시스템 API를 ACE 프레임워크 내부로 감추고 외부로 표준화된 인터페이스를 제공합니다. 일반적으로 많은 시스템 어플리케이션들은 각 운영체제에 매우 종속적이기 때문에 다른 플랫폼으로 이식하는 작업은 상당히 어려운데 ACE의 표준화된 인터페이스를 사용해 작성된 시스템 어플리케이션은 별도의 수정없이 다른 플랫폼으로의 이식이 가능하다라는 장점이 있습니다. 이것은 마치 Java의 JVM과 비슷하게 보일 수 있습니다. (하지만 ACE는 Java의 JVM과는 완전히 다른 개념을 가지며 서로 비교할 수 있는 대상이 아닙니다.) 때로는 운영체제간의 차이로 인해 특정 기능을 지원하는 시스템이 존재할 수 있습니다. 이런 경우 ACE는 자체적으로 특정 기능을 수행하기 위한 시뮬레이션 코드를 실행하게 되며 이것은 마치 시스템에서 해당 기능이 수행되는것과 같은 효과를 보입니다.(물론 이럴경우 퍼포먼스는 떨어지게 마련입니다.) 

또한 ACE 자체는 검증된 수많은 패턴으로 이루어진 객체지향 프레임워크로서 시스템 아키텍쳐를 학습하기 위한 훌륭한 레퍼런스로 활용될 수 있습니다. ACE가 담고있는 수많은 패턴과 철학은 Pattern-Oriented Software Architecture Volume 2에 집약되 있는데... 문제는 이 책을 읽어내기가 엄청나게 어렵습니다... ㅠ

ACE가 많은 장점을 지니고 있는 훌륭한 객체지향 프레임워크임에는 누구도 부인할 수 없을 것입니다. 다만, 이런 훌륭한 ACE를 실무에 사용하기 위해서는 사전 배경지식이 만만치 않으며 초반 학습곡선이 매우 가파르기 때문에 쉽게 익숙해지기가 어렵습니다. 게다가 국내에 소개된 ACE서적은 단 3권으로, ACE의 매우 방대한 내용을 생각해볼 때 단 3권의 서적으로 ACE의 많은 내용을 담아내기에는 무리가 있습니다.






'프로그래밍 > 오픈소스' 카테고리의 다른 글

SQLite with Eclipse  (1) 2010.05.06
SWF파일 분석 도구  (0) 2010.04.13
boost library 설치  (0) 2010.03.17
libcurl 사용하기  (0) 2010.03.15
SQLite  (3) 2009.09.11
ACE(ADAPTIVE Communication Environment)  (0) 2009.09.03
MySQL++  (0) 2009.08.21
C++ 암복호화 라이브러리 Crypto++  (0) 2009.08.20
C/C++ XML Parser TinyXml  (1) 2009.08.20
HttpClient와 Jericho Parser를 이용한 HTML 파싱  (0) 2009.07.28
GeoIP를 이용한 IP대역별 국가코드 검색  (1) 2009.07.07
Posted by devop

댓글을 달아 주세요