728x90

우선 라이브러리들을 생성한후 적용해서 테스트를 할 기본적인 프로젝트를 생성합니다.

 

저는 MFC 로 프로젝트를 생성합니다.

특별한 옵션은 없고, 그냥 응용프로그램 종류에서 단일 문서에만 체크를 해놓고 생성하겠습니다.

프로젝트 명은 CreateLib 라고 했습니다.

 

/////////////// 1. 정적 라이브러리 생성 및 사용법 ///////////////

 

 

Json을 사용하기 위해  jsoncpp를 정적 라이브러리로 만들어 보겠습니다.

 

저는 jsoncpp-src-0.5.0 를 다운받아서 사용합니다.

jsoncpp는 인터넷에서 쉽게 찾아서 다운로드 하실수 있습니다 ~

 

 

1. 사진에 보이듯이 솔루션 오른쪽 클릭 -> 추가 -> 새프로젝트를 누른후 -> win32(win32 프로젝트) 만듭니다.(프로젝트 명: JSon)

 

 

2. 설정은 정적 라이브러리에 체크, 미리 컴파일된 헤더는 해제해주세요.

 

 

 3. 생성완료 하셧으면 아까만든 프로젝트(CreateLib) 폴더안에 JSon이라는 이름의 프로젝트 폴더가 하나 더 생긴것을 확인할수 있습니다.

 

JSon 폴더 안에 lib_json 이라는 폴더를 사진에서 보시는것처럼 붙여놓았는데

 

lib_json 안에 들어가는 목록들은 우선 jsoncpp-src-0.5.0(버전) 을 다운로드 하셧다면

jsoncpp-src-0.5.0 -> src 에 들어가시면 lib_json 폴더가 있는데 우선 그폴더를 복사해서 붙여넣어주시고

jsoncpp-src-0.5.0 -> include에 들어가시면 json 폴더가 있는데 그 폴더를 lib_json에 같이 넣으셔서 사진처럼 넣어줍니다.

 

 

4. 3번까지 완료하셧으면 이제 비쥬얼 스튜디오로 다시 돌아와서 JSon이라는 필터 하나 만들어주시고 거기 안에는 lib_json->json 폴더 안에 있는 헤더파일들을

 

소스 파일에는 lib_json 폴더 안에 있는 json_reader, json_value, json_writer.cpp 를 불러와 줍니다.

(사진은 저렇게 분류해서 불러왓지만 저렇게 분류해서 굳이 불러오지 않아도 됩니다.)

 

 

5. 이제 json.h파일을 include 시키고 우선 생성자 안에 StyledWriter를 하나 만들었습니다. 그 후

빌드를 하면 저렇게 링크 에러가 발생합니다.

링크 에러가 발생하는 이유는 참조를 시켜주지 않아서 컴파일된 함수같은것들을 가져오지 못하기 때문입니다.

 

6. CreateLib 프로젝트 -> 오른쪽 클릭 -> 속성 -> 공용 속성-> 새 참조 추가 까지 실행하신후에

앞서 만들엇던 JSon 프로젝트를 참조로 추가를 해주고 적용시킵니다.

그러면 앞서 발생했던 링크에러가 해결되는 현상을 볼수 있습니다. (JSon을 사용할수 있게 됫죠!)

 

 

7. 여기까지 잘 따라 하셧다면 컴파일 2~3번은 하셨을텐데요.

그러다보면 CreateLib 프로젝트 폴더 -> Debug 폴더 에 들어가보시면 아까 우리가 만들었던 JSon 프로젝트 이름과 똑같은 lib의 확장자 명을 가진 라이브러리가 보일 겁니다.

이 라이브러리가 바로 저희가 컴파일 하는 순간 만들어진 그리고 저희가 얻고자 햇던 json과 관련된 정적 라이브러리 입니다.

이 라이브러리를 이제 프로젝트에 추가만 해주면 앞서 6번에서 햇던 새 참조 추가 이런일을 하지 않아도 json을 그냥 사용할수 있게 됩니다.

 

 

 

 

 

8. 기존 처음 프로젝트엿던 CreateLib 폴더에 7번에서 만들어졋던 JSon.lib 를 복사해서 붙여 넣습니다.

 

 

비쥬얼 스튜디오로 돌아와서 CreateLib 프로젝트 오른쪽 클릭 -> 속성 -> 링커 -> 입력 에서

추가종속성 편집을 실행하신후 추가한 JSon.lib 이름을 적어주시고 적용시켜 주시면

6번에서 하셧던 새참조 추가를 지우고 컴파일 해보셔도 이제 잘 되는 것을 확인할수 있습니다.

 

 

즉. 정적 라이브러리를 생성하고, 적용까지 완료 하셨단 이야기구요. 이제 이 json 라이브러리를 사용하기만 하면 되는겁니다!

 

다음엔 동적 라이브러리 생성 및 적용 포스팅을 해보겠습니다.

 

728x90
Posted by 정망스
,

라이브러리(Library) 란?

C++ 2014. 8. 22. 14:23
728x90

라이브러리 정의부터 일단 정리해보겠습니다.

 

라이브러리를 사용하는 이유는

 

외부에 소스를 유출하지 않고 자신이 만든 모듈을 공유하기 위해서라고 합니다.

그리고 라이브러리 자체가 이미 컴파일이 되어있는 것이라서 컴파일 시간도 단축된다고 합니다.

 

라이브러리의 종류에는 동적 라이브러리와, 정적 라이브러리가 있습니다.

특징별로 어느것을 사용할 것인지를 결정하면 됩니다.

 

1. 동적 라이브러리 ( Dynamic Link Library (dll))

 

- 프로그램 실행 시 필요시만 외부 dll 파일에서 함수를 참조

- 프로그램 실행 시 프로그램 로딩 시간이 단축

- 함수 업그레이드 시 해당 dll만 수정 배포한다.

- 소스 외부 유출 방지 효과

- 실행 파일 만들때 필요한 파일: *.h, *.lib, (*.dll 참조 용)

- 프로그램 실행할 때 필요한 파일: *.dll(배포할 때 *.dll 필요)

- dll 제작시 lib도 같이 생성됨

 

2. 정적 라이브러리 (Static Link Library (lib))

 

- 필요한 함수를 프로그램 코드에 붙여 프로그램 자체에서 참조

- 프로그램 실행 후 빠른 처리시간

- 프로그램 실행 후 빠른 처리시간 프로그램 실행 파일만 있으면 실행(하나의 파일만 있으면 됨)

- 소스 외부 유출 방지 효과

- 실행 파일 만들때 필요한 파일: *.h *.lib(별도의 *.dll 필요 없음)

728x90
Posted by 정망스
,
728x90

우선 제가 쓰는 비쥬얼 스튜디오 버전은 2013입니다.

그래서 환경은 2013에 기반해서 글을 씁니다.

모든 내용이 정확하지는 않을수 있기때문에 안되는 부분이 있을수도... (전 이대로 해서 됫다는.. )

이제 설명글을 적어 볼게요.

 

1. Boost 라이브러리 다운로드

 

 http://www.boost.org/

 

위 사이트에서 원하는 버전의 라이브러리를 다운 받으신후 압축을 풉니다. 압축푸는 위치는 적당한곳에 아무곳이나..(혹시나 모르니 되도록 한글이 들어가는 경로에는 제외하시길...)

 

 

2. 압축푼 폴더내에 있는 bootstrap.bat을 실행 -> b2.exe와 bjam.exe 파일이 생김

 

 

3. cmd창에서 이제 b2.exe를 실행합니다.

 

아무래도 b2를 실행하는것이 이제 빌드를 하는 부분인것같습니다.

실행과 동시에 빌드 옵션을 설정할수가 있는데요.

 

(toolset, address-model 같은 경우는 잘 알아보시고 옵션 주셔야 할듯 합니다.)

 

 

toolset 같은경우에는 c++ 컴파일러를 뜻하는 부분같은데, 지금 저는 visual studio 2013 이기때문에 msvc-12.0 입니다.

address-model 같은경우에는 32비트, 64비트를 정하는 부분 같은데요. 이것도 프로젝트 환경에 맞는 것으로 잘 선택하시길.. 안맞으면 아예 꼬입니다.

 

혹여나 저렇게 치셧는데 toolset=msvc-12.0 에서 뭐 나는 얘를 못찻겟다 모르겟다 뭐 이런 영어로 에러가 나시는 분들은

환경변수를 한번 설정해 보세요.

 

 

 

저는 이렇게 설정햇구요, 아무래도 저 경로안에있는 vsvars32.bat을 실행해야 하나 봅니다.

 

빌드 옵션과 관련해서 더 자세히 알고 싶으신분들은 아래 사이트 참고 하세요.

http://www.boost.org/boost-build2/doc/html/bbv2/overview/invocation.html

 

4. Visual Studio 프로젝트 속성 설정

 

위 3번 과정에서 빌드가 끝나면 뭐 대충 이런 화면에서 끝이 나더군요 (빌드 시간은 저는 한 5~10분 걸린거 같은데 어떤 분들은 심하게는 30분도 걸린다는분도 있고.. 아무튼 어느정도 좀 걸립니다.)

 

 

밑사진처럼  경로를 설정해서 포함시켜 주면 됩니다.

 

 

 이제 인클루드 해서 씁시다 ㄱㄱㄱㄱ

 

 

 

etc)...정보를 찾아보다

이방법 말고 다른 방법이 또 있더군요.

 

1.

http://www.boost.org/ 에서 visual studio 버전에 맞는 prebuilt windows binary를 다운받아 설치하시고

visual studio 에서 header 경로와, library 경로를 잡아주는 방법

 

2.

NuGet을 이용하는 방법

가장 쉽고 빠른 방법

하지만 NuGet를 이용해서 boost를 설치하면 해당 프로젝트 하위 디렉토리에 몇백 메가..가 되는 용량의 boost library가 통째로 들어간답니다. 배포할때 있어서 소스들을 라이브러리까지 전부다 배포해야 된다 하면 쓰면 좋답니다.

 

 

728x90
Posted by 정망스
,
728x90
링크드 리스트는 구조체나 배열처럼 C++에서 제공하는 기능이아니다.

 

그렇기 때문에 직접 만들어서 사용해야 하는데,반적으로 조체와 포인터를 사용해서 만들 수 있다.

 

예를들어 우리가 1,2,3,4라는 4개의 데이터를 보관해야 한다고 생각했을때

 
이 4개의 데이터가 배열에 보관된 모습과 링크드 리스트에 보관된 모습을 비교해보자.

 

// 배열
arr : | a | b | c | d |
사용자는 배열의 시작주소(arr = &arr[0])만 보관하고 있으면 된다.

// 링크드 리스트
a -> b -> c -> d
사용자는 첫번째 노드(a)의 위치만 보관하고 있으면 된다. 

 

배열은 차례대로 위치한 공간에 a ,b, c, d를 포함하고 있다.

 

링크드 리스트는 a, b, c, d를 담은 공간이 차례대로 위치하지는 않는다.
대신에 a는 b와 연결되고, b는 c와 연결되고, c는 d와 연결되는 방식으로 전체 아이템들을 보관한다.
이름처럼 연결된 리스트이다.

위의 배열 링크드 리스트를 보면

 

배열의 경우 3에 접근을 하기 위해서는 *(arr+2), arr[2] 등과 같이 한번에 접근이 가능
하다.

 

하지만 링크드 리스트는 c가 있는 곳까지 가려면 a,b를 거쳐야 한다.

이렇게 구성된 상태에서 사용자가 배열과 링크드리스트를 사용하는 시나리오를 생각해보자.

 

배열은 각 원소들이 차례대로 줄지어서 위치하기 때문에 이렇게 단순한 덧셈을 통해 원소에 접근이 가능하다.

 

하지만 링크드리스트배열처럼 차례대로 위치한것이 아니기 때문에 첫번째 노드부터 하나씩
거쳐가면서 c을 보관한 곳을 찾아가야 한다. 

 

구체적으로 말하면 일단 첫번째노드(a)에 접근해서 두번째 노드(b)의 위치를 알아내고, 다시 두번째 노드(b)에 접근한뒤

다음엔 세번째 노드(c)의 위치를 알아낼 수 있다. 결국 c를 보관한 노드에 접근할수 있게되는 식이다.

 

여기까지만 보았을때는 배열이 훨신 좋다.

 

어떤 원소에 접근하려고 할때 배열은 덧셈 한번만 하면 끝나지만, 링크드리스트는 첫번째 노드부터 원하는 노드에 이르기까지

모든 노드를 한번씩 거쳐야 하기 때문이다.

하지만 링크드리스트의 진정한 강점은 노드의 삽입과 삭제가 훨씬 간단하다는 점이다.

 

우선 배열과 링크드리스트에 e라는 데이터를 보관할 새로운 공간을 추가하는 시나리오를 생각해보자
이는 두가지로 나누어 볼수 있는데 배열이나 링크드 리스트의 중간에 삽입하는 경우와 끝에 삽입하는 경우가 있다.

 

※원소와 노드

- 배열에서 a,b,c,d를 보관하는 공간을 원소(Elements)라고 부른다.
비슷하게 링크드 리스트에서 a,b,c,d를 보관하는 공간을 노드(Nodes)라고 부른다.

 


// 배열
arr : | a | b | c | d | e

 

배열이 원소 5개를 보관할 수 있을만큼 크게 정의됐다는 가정하에서 끝에 e를 추가할수있다.


 

// 링크드 리스트
a -- b -- c -- d
e를 보관할 노드를 만들어서 d의 노드와 연결시키면 된다.

 

배열의 끝에 e를 포함하는 원소를 추가하려면 처음 배열을 만들 때부터 충분한 크기의 공간을 만들어야 한다.
만약 원소 4개짜리 배열이었다면 실행중에 새로운 원소를 추가하는 것은 불가능하다.

하지만 링크드리스트 경우에는 e를 포함하는 새로운 노드를 만들고, 마지막 노드와 새로운 노드를 연결시켜주면 끝난다.

 

 

이번에는 배열이나 링크드 리스트 중간에 새로운 정보를 삽입하는 시나리오를 보자.

 

우선 배열의 경우 e라는 값을 a와 b사이에 삽입하려면 b~d까지의 원소를 뒤로 한칸씩 밀어내야 한다.

그다음에 기존에 b가 있던 위치를 e에 넣으면 된다. 만약 10000개쯤있는 배열이라면 9999개의 원소를 밀어내야한다.

 

반면 링크드리스트 a와 b의 연결을 끊은 후에 a와 e, e와 b를 연결시키면 간단하게 끝난다. 

그 뒤에 9999개의 노드가 있더라도 똑같다.

이런식으로 비교를 해봤을때 삽입삭제 면에서는 링크드리스트가 훨씬 압승이라는 점을 느꼈을 것이다.

 

 

728x90
Posted by 정망스
,
728x90

요즘은 학원을 다니며 c++을 본격적으로 배우고있다.

자바나, 다른 웹언어를 더 많이 공부한 나로썬 종종 잘이해가 안가거나(본래 이해력이 많이 부족...)

멈칫 멈칫 거릴때가 너무 많다; 서론은 여기까지고..


특히 요새 애먹고 있는부분이 이 포인터 부분이다.


아직까지도 완벽히 다 이해한건 아니지만 요즘들어 배열과, 포인터를 많이 쓰던도중 


이번 글의 제목과 같이 "포인터배열", "배열포인터" 앞뒤 순서가 바뀐 이 둘의 차이가 궁금해졌고..

나 자신에게 이런거같다라고 정의를 하고 글에 끄적끄적 적어본다... (뭐 틀릴수도 있음... 양해바람)


(포인터)(배열) = 포인터배열포인터로 이루어진 배열이라는 뜻

(배열)(포인터) = 배열포인터는 배열을 가리키는 포인터라는 뜻으로 보면 될듯하다.


그렇다면 이제 간단한 코드로 한번 보자.


ex)포인터배열


char a[10] -> char형 변수 word[0],word[1].... word[9] 총 10개의 변수를 선언한것이다.


char* str[10] -> char형 포인터 변수 *str[0], *str[1]..... *str[9] 총 10개의 포인터 변수를 선언한것이다.

여기서 *str[10]을 포인터배열이라고 한다.



ex)배열포인터


char a; -> a는 char형 변수

char a[10]; -> a[10]은 char형 배열


char a[10];

char *str = a; -> a[10]은 char형 배열이고, *str은 a라는 배열을 가리키는 포인터이다.

여기서 *str을 배열포인터라고 한다.


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2차원 배열을 배열포인터로 가리킬때는 선언방식이 조금 다르다고 한다.


char a[5][10];

char (*str)[10];

str = a;


2차원 배열을 가리키는 배열포인터는 반드시 배열의 크기를 맞춰줘야 한다고 한다.

이유는 포인터가 가리키는 현재 칸에서 다음칸으로 이동하는데 있어서 실제 배열을 이동하는것과 동일하게 이동

해야 하기 때문이라 한다.


ex) str = a[0], str+1 = a[1], ....... str+4 = a[4]




728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침