2014년 6월 3일 화요일

TBB tutorials

TBB설치 (VS 2008)

○ www.threadingbuildingblocks.org
    접속->Download메뉴->안정화버전(Stable Release) 선택. 최신버전링크 클릭.
○ 원도 운영체제의 경우: tbb40_20110809oss_win.zip선택
○ 20MB파일을 받아 폴더에 압축 해제. 이 폴더 위치를 잘 기억함.
○ 환경변수 설정: TBB_INSTALL_DIR을 사용. 내컴퓨터->속성->시스템보호->고급->환경변수설정->새로만들기: 변수이름(TBB_INSTALL_DIR), 변수값(d:\tbb\tbb40_20110809oss) 등 설정



실행 디렉토리 설정
○ 속성->구성속성->디버깅->명령->찾아보기. 생성되는 파일, dll 등의 위치 설정.


DLL부분:
○ 속성->구성속성->C/C++->일반->추가 포함 디렉토리: 여기에
\(TBB_INSTALL_DIR)\include , 단 tbb설치가 되어 있고, TBB_INSTALL_DIR키워드는 미리설정, Release/Debug모드 별로 설정

○ 속성->구성속성->링커->일반->출력파일: ../Release/tbbMatch_Parallel_Dll.dll  (모드별로 설정)
○ 속성->구성속성->링커->일반->추가 라이브러리 디렉토리:
\$(TBB_INSTALL_DIR)\lib\ia32\vc9 (VC++9버전의 경우)
○ 속성->구성속성->링커->입력->추가종속성: tbb.lib (release), tbb_debug.lib(debug모드)


Run부분:
○ 속성->구성속성->C/C++->일반->추가 포함 디렉토리: 여기에 $(TBB_INSTALL_DIR)\include, 단 tbb설치가 되어 있고, TBB_INSTALL_DIR키워드는 미리설정, Release/Debug모드 별로 설정
○ 속성->구성속성->링커->일반->추가 라이브러리 디렉토리: $(TBB_INSTALL_DIR)\lib\ia32\vc9 (VC++9버전의 경우)
○ 속성->구성속성->링커->입력->추가종속성: ../Release/tbbMatch_Parallel_Dll.lib tbb.lib(Release모드),  ../Debug/tbbMatch_Parallel_Dll.lib(Debug모드), (release), tbb_debug.lib(debug모드)

배포시 Debug/Release모드에 맞는 dll/lib파일 생성방법
○ DLL프로젝트부분에서 속성->구성속성->링커->일반->출력파일: ../Debug/visOCV_debug.dll(Debug모드), 또는 ../Release/visOCV.dll(Release모드) 입력하면 해당명의 dll생성



Solution을 통한 DLL과 Run프로젝트 동시 작성
○ 파일->새로만들기->프로젝트->기타프로젝트형식->Visual Studio 솔루션:
빈솔루션/이름(적당한 이름으로 설정해 준다)/위치(적당한 위치로 설정해 준다)

○ 솔루션탐색기의 솔루션을 오른쪽 마우스로 클릭->추가->새프로젝트->Visual C++->Win32->Win32콘솔응용프로그램(이름, 위치 설정), 다음 누르고 옵션에 Dll(D)과 빈프로젝트(E) 선택후 마침

○ 솔루션탐색기의 솔루션을 오른쪽 마우스로 클릭->추가->새프로젝트->Visual C++->Win32->Win32콘솔응용프로그램(이름, 위치 설정), 다음 누르고 옵션에 콘솔응용프로그램(O)와 빈프로젝트(E) 선택후 마침


솔루션에 딸린 두 프로젝트 생성이 되었다면 개별 프로젝트의 설정을 시작한다:
○ Dll 프로젝트의 속성->구성속성->링크->일반->출력파일: 모드별로 ../Release/파일이름.dll과 ../Debug/파일이름_debug.dll 입력. 이 두 파일이 생성된 dll파일들로 모드별로 생성함. 생성된 dll을 사용할 때도 모드에 마추어 사용하여야 한다.

○ Run용 프로젝트 속성->링커->입력->추가종속성: 모드별로 ../Release/파일이름.lib와 ../Debug/파일이름_debug.lib입력.  dll이 아니고 lib이다. 즉, Dll프로젝트에서 생성한 dll파일을 실행 프로젝트에서 사용할 것이라는 점을 명시하는 부분이다.


종속성을 설정한다:
○ 솔루션->프로젝트종속성: Run프로젝트가 Dll프로젝트에 종속되어야 한다(왜냐하면 Run프로젝트가 먼저 생성된 dll을 사용하여야 하기 때문). 따라서 프로젝트(R):에 Run프로젝트 선택, 다음에 종속(D):에 Dll프로젝트 체크

○ 코딩후 빌드->전체다시빌드 한다. (debug모드, release모드 각각 실행)
○ 솔루션->Dll프로젝트->속성->구성속성->디버깅->명령: 찾아보기 눌러 솔루션/debug밑에 생성되어 있는 실행파일(debug모드)을 선택, 솔루션/release밑에 생성되어 있는 실행파일(realse모드)을 선택해 준다.

○ 다시 리빌드 하면 완료.


프로그램의 작성
○ Dll 프로젝트 디렉토리 내에 필요한 파일을 다 넣고, Run 디렉토리에는 Run 프로그램만 넣는다.
예를 들면, Dll 프로젝트 내에 header파일과 cpp파일이 있다면, Run 부에는 Dll부의 cpp를 호출하기 위해 Dll부의 header파일을 include하는 Run 프로그램 파일만 넣는다.

// Dll프로젝트 내의 header파일
#define DLLEXPORT
#ifdef DLLEXPORT
#define DLL_MODE __declspec(dllexport)
#define EXPIMP_TEMPLATE
#else
#define DLL_MODE __declspec(dllimport)
#define EXPIMP_TEMPLATE extern
#endif

#pragma once

#include <iostream>
#include <vector>
#include <math.h>
#include <time.h>
#include <conio.h>

using namespace std;
class DLL_MODE visTestDll
{
public:
 visTestDll(int a, float b);
 visTestDll();
 ~visTestDll();
};

상기한 header파일의 선행연산자 부분은 그대로 사용하면 된다. 다만 나중에 DLL생성 후, Dll 프로젝트 부분의 소스를 제거하고 사용할 때에는 첫줄의 #define DLLEXPORT 만 제거한 후 사용한다.


// Dll 프로젝트 내의 실행소스 코드
#include "TestDll.h"

visTestDll::visTestDll() {}

visTestDll::visTestDll(int a, float b)
{
 printf("%4d,  %8.4f\n", a, b);
}
visTestDll::~visTestDll()
{
 printf("Destructing...\n");
}

특별한 연산은 하지 않으며 객체 생성 후 인자를 화면에 출력하는 작업을 한다.




Run 프로젝트 내에 존재하는 실행(호출) 파일은 다음과 같다.

// Run 프로젝트 내의 Dll 호출(실행) 파일
#include "../TestDll/TestDll.h"

int main()
{
 visTestDll a(10, 20.0f);
 return 0;
}

댓글 없음:

댓글 쓰기