Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2025/9 »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

 
 
배포시에는 Dependency Walker(depends.exe)와 같은 도구를 사용하여 종속 DLL의 목록을 확인한다. 또한 2005이상의 VS(Visual Studio)는 manifest를 꼭 확인해서 사용한 dll과 버전을 확인해야한다.

VC++ Library
그림 1(VS2005 기준)

그림은 VS2005를 기준으로 하고 있지만 다른 버젼도 위와 같은 규칙으로 명명되고 있다. xx는 각각의 버전을 나타내며 플랫폼 별로 x86,ia64,x64용이 따로 있다. u는 Unicode버전을 나타내고 m은 managed code를 사용했을때 사용되며 배포시 .NET Framework이 필요하다. 배포폴더에 manifest가 존재하면 같이 배포한다.

참고
Visual C++ Libraries as Shared Side-by-Side Assemblies - MSDN


컴파일러와 라이브러리의 버젼을 나타내는 매크로

Predefined Macros - MSDN

_MSC_VER(MS 컴파일러)

  Visual Studio 4.0  1000
  Visual Studio 5.0  1100
  Visual Studio 6.0  1200
  Visual Studio .NET 2002  1300
  Visual Studio .NET 2003  1310
  Visual Studio 2005  1400
  Visual Studio 2008  1500

_MFC_VER(MFC 버젼)

 Visual Studio 6.0   0x0600
 Visual Studio .NET 2002   0x0700
 Visual Studio .NET 2003  0x0710
 Visual Studio 2005  0x0800
 Visual Studio 2008  0x0900

_ATL_VER(ATL 버젼)

 Visual Studio 6.0   0x0300
 Visual Studio .NET 2002   0x0700
 Visual Studio .NET 2003  0x0710
 Visual Studio 2005  0x0800
 Visual Studio 2008  0x0900


VC 6 이하(~ VS6)
VC6관련 DLL은 98이후부터는 운영체제에 포함되어 있다. 그러므로 현재는 배포시에 거의 문제될게 없다.

참고
ActiveX 배포를 위한 cab파일(MS) - inf파일에 링크를 추가해준다.
Vcredist.exe로 Visual C++ 응용 프로그램용 최신 런타임 구성 요소가 설치된다 - MSDN고객지원

VC 7.1(VS 2003)
VC7.1관련 DLL은 최신 운영체제라고 해서 더는 기본 내장을 해주지않기 때문에 응용 프로그램이 알아서 자기 디렉터리나 윈도우 시스템 디렉터리에다 구비해야 한다.



VC 8이후(VS 2005~)

Side by Side Asembly
2005부터는 side by side asembly라는 기술이 도입되어 VC관련 라이브러리들이 Windows 디렉토리 밑에 WinSxS (Windows Side-by-Side)라는 공유 폴더(native assembly cache)로 관리된다. side by side asembly는 DLL 충돌문제를 해결해서 각각의 어플리케이션에게 독립적인 DLL환경을 제공하기 위한것으로 여러버젼의 DLL들이 등록될수 있다. 복잡한 이과정을 간단하게 해결하는 방법으로 VC8부터는 재배포 패키지(Redistributable Package)라는 배포용 설치파일이 도입되어 공용 라이브러리를 자동으로 설치/등록해준다. 또한 프로젝트에서 자동 생성해주는 Manifest Flie에 사용된 DLL과 버전이 자동으로 입력되니 배포시는 꼭 확인하도록 한다.
프로그래머나 사용자입장에선 관련 DLL을 포함만 하면 되는 기존 작업과 달리 설치파일이 하나 더생겼으니 귀찮은 작업이지만 최신 운영체제의 기본 관리 방법이기도 하고 .Net의 기술과도 무관하지 않으니 지금 정리하도록 하자.


최신 라이브러리를 Manifest에 기술하기(VC9)
배포방법을 알아보기 전에 알아두어야 할사항이 있다. VC9는 VC8과 달리 sp1같은 최신 라이브러리를 개발자PC에 설치했다고 해도 프로젝트가 최신라이브러리를 사용한다고 명시해주지 않으면 기존라이브러리를 기본으로 사용하므로 주의해야한다. 이것은 개발자가 sp1을 설치했어도 프로젝트는 기존 DLL버전을 사용하므로 배포시 sp1용 재배포 패키지를 사용하면 제대로 실행될 수 없음을 나타낸다. 방법은 아래와 같다.

'_BIND_TO_CURRENT_VCLIBS_VERSION'를 프로젝트 설정에서 선언해준다.
-> stdafx.h의 상단에 #define으로 입력해도 일반적인 프로젝트에선 상관없지만 프리컴파일드 헤더를 사용안하거나 외부라이브러리가 프로젝트에 미리 세팅되었을 경우 두개의 버전을 중복 사용하는 경우가 발생할 수 있으므로 프로젝트 설정에서 선언하길 권장한다. 이값은 CRT,MFC,ATL,OPENMP 4개의 '_BIND_TO_CURRENT...' 선언을 다 쓰겠다고 선언하는것이고 _BIND_TO_CURRENT_VCLIBS_VERSION의 기본값은 0으로 세팅되어있다.


참고

응용 프로그램 재배포 및 특정 라이브러리에 바인딩 - MSDN

최신 라이브러리를 메니페스트에 기술하기


배포방법
그림1과 참고에 MSDN링크가 2005의 공용DLL 목록과 설명이다. side by side asembly로 인해 배포문제가 좀 복잡해져서 depends 만을 확인해서 관련 DLL을 포함한다고 제대로 실행된다는 보장을 받을 수 없게되었다. 일반적인 방법과 재배포 패키지를 사용하는 방법을 알아보자.

1. 정적 라이브러리(Static Library)를 사용한다.
실행파일이 커지긴 하나 제일 간단하다. MFC 라이브러리를 사용시는 MFC라이브러리를 정적으로 포함하면 CRT도 자동으로 /MT로 변경된다. 용량은 기본 MFC 다이얼로그 프로젝트가 52k정도에서 308k 정도로 커진다.
ATL과 OPENMP까지 사용한다면 웹에서 배포되는 ActiveX 같은 상황이면 용량때문에 고민해봐야할 문제이고 정적라이브러리도 동적라이브러리와 똑같다고는 하지만 몇가지 버그가 있으므로 주의하자.

참고
MFC Static으로 소켓사용시..

2. Manifest를 참조해서 기본 DLL을 배포한다.(Private Assembly)
배포방법이 바뀌었다곤 하나 관련 DLL을 포함해서 배포할수도 있다. VS의 설치폴더에 있는 공용DLL(Private Assembly)을 같이 배포하면 된다. 우선 Manifest로 사용한 DLL을 확인한후 "..\Microsoft Visual Studio X\VC\redist\"에서 관련 DLL(그림1참고)을 프로젝트 폴더에 포함한다. 이방법도 쉬운편이긴 하나 3MB정도의 크기인 재배포 패키지에 비하면 사용하는 라이브러리가 많을 수록 용량이 너무 큰편이다.(기본 CRT와 MFC라이브러리만 4.76MB - 2008sp1 기준)

3. 인스톨쉴드(Install Shield), 설치 프로젝트를 이용해서 재배포 패키지가 자동으로 설치되게 한다.
 -> 모든 프로젝트를 이렇게 만들긴 좀 귀찮다;;

4. .Net Framework(최신)를 설치한다.
.Net Framework를 설치하면 CRT관련 DLL만 같이 설치된다.(fx 3.5설치시 8.0과 9.0이 같이 설치됨)
managed로 컴파일했다면 .Net Framework는 필수이므로 고민할 문제가 아니지만 용량이 100메가도 훨씬 넘는다..;;

5. 재배포 패키지 - 아래에서 따로 설명한다.

위 방법 외에도 몇가지가 더 있으며 아래링크를 참조하기 바란다.
RedistributingVisualCppRunTimeLibrary
Bootstrapper for the VC++ 2005 Redists (with MSI 3.1) - codeproject

재배포 패키지(Redistributable Package)
재배포 패키지는 Windows Installer 3.1을 필요로 하는 인스톨 파일이다. 한번 실행하기만 하면 자동으로 설치되지만 사용자 입장에선 불편한 사항이다. 하지만 Windows Installer의 Command line을 이용해서 몰래설치하는 방법이 있다. 이를 이용해서 런처형식의 프로그램을 만들면 Windows Installer 3.1의 설치유무와 재배포 패키지 자동 설치를 하고 프로그램을 실행하게 할 수 있다. 좀더 범용적으로 사용하면 파일로 설치필요 설정값을 받아와서 COM관련 등록이나 웹배포시 ActiveX등록등을 자동으로 하게 만들수도 있다. 관련 소스가 정리되는 대로 블로그에 올리도록 하고 우선 VC6으로 재배포 패키지의 설치유무와 자동 실행하기 위한 코드를 설명하겠다.

1) 재배포 패키지 설치 유무 확인
재배포 패키지는 설치폴더에서 받거나(..\Microsoft Visual Studio X\SDK\v2.0\BootStrapper\Packages\vcredist_x86) 아래 링크를 통해 MS의 다운로드에서 받는다.

2-1) 일반 적인 인스톨러 사용처럼 추가/제거 목록에 표시되므로 레지스트리 값으로 확인할 수 있다.
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ProductCode"

2-2) MsiQueryProductState API를 이용해서 확인한다.
리턴값으로 INSTALLSTATE_DEFAULT인지만 확인하면 설치유무를 판단할 수 있다.

위 2개의 방법에서 모두 필요한 ProductCode는 아래와 같다.

Visual C++ 2005 runtime files

Visual C++ 2005 SP1 runtime files

Visual C++ 2008 runtime files

Visual C++ 2008 SP1 runtime files

위코드는 영문 버전이고 한글버전은 다르고 설치시 중복될수 있다. ProductCode와 추가/제거에 표시되는 이름외에 다른점은 없다. 참고로 2008 sp1 x86 한글버전은 {887868A2-D6DE-3255-AA92-AA0B5A59B874}이다.
Window7에서도 테스트 했음.

참고
How to detect the presence of the VC 8.0 runtime redistributable package
How to detect the presence of the Visual C++ 9.0 runtime redistributable package
NSIS로 VC8.0 Redistributables 체크방법
MsiQueryProductState를 통한 VC 2005 Redistribute 라이브러리 설치체크 방법


2) 재배포 패키지 몰래 설치하기(Command Line)
명령행으로 실행시 Windows Installer 로 만들어진 패키지는 /?로 명령어 종류를 볼수 잇다.

VS2005
VC2005의 경우는 재배포 패키지가 VS기본 폴더에 존재하는 설치파일과 웹에서 받은 파일이 좀 다른데 웹에서 받은 재배포 패키지의 경우 압축이 한번더 되어있어서 인자값 설정 방법이 다르다. 또한 압축이 몇번에 걸쳐 되어있으므로 한글로 계정이 되어있어 한글 경로가 있을 경우 잘 설치가 안될수도 있다. 필자는 2008을 사용하므로 2005에 대한 사항은 관련 링크로 정확한 정보를 얻자.
How to perform a silent install of the Visual C++ 8.0 runtime files (vcredist) packages
- VS기본 폴더에 포함된 재배포 패키지 설치
VC 8.0 런타임 (vcredist) 패키지 몰래 인스톨하기 - 웹에서 받은 재배포 패키지 설치(번역)
Visual C++ 2005 재배포 패키지가 설치안될때



VS2008
2008에서는
<full path>\vcredist_x86.exe /qb
<full path>\vcredist_x86.exe /qb!
<full path>\vcredist_x86.exe /q   -> 화면에 전혀 보이지 않음
위 3가지 방법중 선택해서 사용하면 되며 Vista이상의 경우는 /q로 설정해도 UAC가 보이므로 필자는 /qb!를 사용한다. 직접 사용해보고 판단하자.

참고
How to perform a silent install of the Visual C++ 2008 redistributable packages

99%'s Code
위 재배포 패키지 몰래설치하기 코드를 간단하게 정리했음.

1. 설치유무 판단후 재배포 패키지를 설치하고 원하는 파일을 실행한다.
 // 2008 sp1
    CString csProduct = "{887868A2-D6DE-3255-AA92-AA0B5A59B874}";  
//{9A25302D-30C0-39D9-BD6F-21E6EC160475}

    INSTALLSTATE t = MsiQueryProductState(csProduct);
    if(INSTALLSTATE_DEFAULT != t)
    {
        AfxMessageBox("재배포 패키지를 설치하겠습니다.");
 //    WinExec("vcredist_sp1_x86.exe /q",SW_SHOW);
        WinExec("vcredist_sp1_x86.exe /qb!",SW_SHOW);
        AfxMessageBox("설치 완료");
 // xp에선 설치완료후 정확하게 뜨지만 Windows7에선 완료되지 않았는데 뜬다.
    }
    else
        AfxMessageBox("이미 설치됨");
  
    // 아래 레지스트리값의 유무로 판단할수도 있다.(win7에서도 똑같다.)
    //HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{887868A2-D6DE-3255-AA92-AA0B5A59B874}
  
    while(INSTALLSTATE_DEFAULT != MsiQueryProductState(csProduct))
        Sleep(30);
    WinExec("test.exe",SW_SHOW);    // 원하는 프로그램 실행
2. 제거
    WinExec("vcredist_sp1_x86.exe /qu",SW_SHOW);
    AfxMessageBox("제거 완료");

:

time_t(VC6 -> VC8) - 081117

버그리포트 | 2009. 8. 21. 20:08 | Posted by 99%

요점부터 말씀드리면

VC6의 time_t가 long형으로 디파인 되어있는데요.

VC8에선 요놈이 __int64이더라구요 ㅡ.ㅡ; 잘돌아가던 소스가 갑자기... ㅡ.ㅡ;


// 임시 해결방법(아래껄 디파인하면 32비트형으로 쓸수 있음)

_USE_32BIT_TIME_T
In versions of Visual C++ and Microsoft C/C++ before Visual C++ 2005, time_t was a long int (32 bits) and hence could not be used for dates past 3:14:07 January 19, 2038, UTC. In Visual C++ 2005, time_t is equivalent to __time64_t by default, but defining _USE_32BIT_TIME_T changes time_t to __time32_t and forces many time functions to call versions that take the 32-bit time_t. For more information, see Standard Types and comments in the documentation for the individual time functions.


c:\Program Files\Microsoft Visual Studio\VC98\Include\TIME.H

#ifndef _TIME_T_DEFINED
typedef long time_t;        /* time value */
#define _TIME_T_DEFINED     /* avoid multiple def's of time_t */
#endif


////////////////////////////////////////////////////////////////////////////

c:\program files\microsoft visual studio 8\vc\include\crtdefs.h
#ifndef _TIME64_T_DEFINED
#if     _INTEGRAL_MAX_BITS >= 64
typedef __int64 __time64_t;     /* 64-bit time value */
#endif
#define _TIME64_T_DEFINED
#endif


DLL과 연결된 콜백함수였는데.. time_t인자 이후로는 값이 이상하게 전달되서 오늘 하루 완전

별짓을 다했네요 ㅎㅎ

에러도 안나구요. 아무 문제없이 컴파일 됩니다. 다만 늘어난 자료형에 따라 그뒤에 변수들 값이 4바이트메모리 만큼 밀린곳의 값을 가져오더라구요 ㅡ.ㅡ;;;;;;;; 맨마지막 변수는 쓰레기값;;

제가 찾은 몇개 사용법및 주의 사항 링크입니다. 이런거로 삽질하지 맙시다;;윽; ㅋ


Visual C++ 2005의 CRT 기능(MSDN)

-> time_t의 기본 크기가 이제 64비트입니다. 이는 3000년까지만 처리하는 여러 가지 시간 함수와 time_t의 범위를 확장한 것입니다. :Track('ctl00_rs1_mainContentContainer_cpe355591_c|ctl00_rs1_mainContentContainer_ctl81',this);" href="http://msdn.microsoft.com/ko-kr/library/w4ddyt9h.aspx">시간 관리 및 개별 시간 함수를 참조하십시오.

http://msdn.microsoft.com/ko-kr/library/ms235429.aspx

 

time_t 와 InterlockedExchange 사용금지 (Visual Studio 2005 변경)

http://a.tk.co.kr/entry/timet-%EC%99%80-InterlockedExchange-%EC%82%AC%EC%9A%A9%EA%B8%88%EC%A7%80-Visual-Studio-2005-%EB%B3%80%EA%B2%BD


:
현재 2009년 7월 기준으로 최신 버젼은 1.1pre1이다.
아직 정식버젼이 아니고 '오픈소스 OpenCV를 이용한 컴퓨터 비전 실무 프로그래밍' 책을 기준으로 정리하므로 1.0을 기준으로 정리한다.

http://sourceforge.net/projects/opencvlibrary/ - 소스포지
http://opencv.willowgarage.com/wiki/ - OpenCV Wiki(문서)
http://tech.groups.yahoo.com/group/opencv/ - 야후 그룹스
http://www.opencv.co.kr/  - 우리나라 최대 커뮤니티
http://opencv.jp

oepncv.jp의 docs- 번역해서 한글로 보기
OpenCV docs - 검색가능
OpenCV docs - conv2(설치폴더의 docs)

다운로드
http://sourceforge.net/projects/opencvlibrary/files/ 에서 open-cv -> 1.0 -> OpenCV_1.0.exe를 다운받는다.

설치
받은 파일을 실행해서 설치한다. 기본설정은 C:\Program Files\OpenCV으로 되어있으며 설치파일은
폴더를 환경변수에 Path등록과 bin폴더안에 calibfilter.ax,proxytrans.ax,syncfilter.ax 3개의 Activex를 등록한다.
registerall.bat를 이용하면 엑티브엑스 3개는 자동등록된다.

사용하기

1. 디버깅정보를 얻기위해서 다시 컴파일 해야된다. 설치폴더안에 _make폴더에서 opencv.dsw를 실행한다.

* Batch Build에서 필요한것만 체크하자.

cvaux.h파일의 1137 Line에서 주석처리를 잘못해서 에러가 난다.
//수정전
   CvMemStorage*   storage;      /*storage for 밼oreground_regions\/              \
//수정후
   CvMemStorage*   storage;      /*storage for Foreground_regions*/                \
위와같이 변경하고 컴파일하면 성공.


2. VC개발환경에 OpenCV의 헤더파일, 라이브러리 폴더를 설정해준다.

Tool -> Option -> Directory

Include에
C:\PROGRAM FILES\OPENCV\CV\INCLUDE
C:\PROGRAM FILES\OPENCV\CVAUX\INCLUDE
C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
C:\PROGRAM FILES\OPENCV\ML\INCLUDE
C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE
C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI

Library에
C:\PROGRAM FILES\OPENCV\LIB


3. DLL 구성

DLL파일은 총 7개이고 C:\Program Files\OpenCV\bin에 존재한다.
환경변수로 설정했을 경우 사용자는 배포시에만 필요 dll을 포함하면된다.

보통 3~5개의 dll이 사용되며
영상을 읽고, 변환하고, 보여주는 함수만 사용하면 cv100.dll, cxcore100.dll, highgui100.dll만 있으면된다.

53Page

libquide40.dll은 OpenMP라이브러리이다.

샘플프로그램
설치폴더에 samples\c에 존재하며 이와는 다르게 tests라는 폴더는 cv,cxcore라이브러리 내 주요 함수를 검증하기 위한 테스트 코드도 존재한다.


55Page

CvvImage 클래스

highgui.h에 선언되어 있다. 유일하게 dc를 사용하는 클래스.

193Page

MS VS2003부터 ATL에 Cimage라는 클래스가 추가되었으며 CvvImage와 구조가 비슷하다.
CImage는 C#의 그래픽 엔진인 GDI+를 Wrapping한 클래스이다.

CImage - MSDN

GDI+ (& CImage) - 99%의 정리

코너, 외곽선, 에지 설명(p.142)

정성호,이문호님의 책 예제
※ 소스삭제 -> 소스는 저작권이 있으므로 책을 사서 정리된 내용을 참고하시길..

ConsoleCV First.zip

-> Chapter1까지의 간단예제

ConsoleCV.zip

-> Chapter2와 Chapter6(cvcam)의 첫부분 예제. 함수마다 페이지를 적어놨음.

OpenMFC MFC첫 사용예제(4장).zip

-> Chapter4. MFC 처음 사용예제( CvvImage를 이용한 영상 읽기,저장,출력<From DC>, 클립보드<DIB>, 로그창)

OpenMFC_5장.zip

-> Chapter5 예제(RGB 컬러공간분리, 공간영역필터링<필터기술>, HBitmap으로 변환후 Picture컨트롤에 출력, CvvImage버퍼를 이용한 취소,복원기술)

OpenMFC_6장.zip

-> Chapter6 예제(cvcam를 사용, facedetect예제와 ConsoleCV의 간단 예제를 이용해서 얼굴 추출을 구현한 예제)

facedetect.zip

-> 얼굴추출소스<444Page>, 6장 예제의 기본소스
(OpenCV 기본 Sample폴더에 있는 facedetect예제에 저자가 주석을 달아서 정리한것이다.)


참고
오픈소스 OpenCV를 이용한 컴퓨터 비전 실무 프로그래밍 : 기본편 - 정성호,이문호 저
http://www.conv2.com/ - 이문호님 홈페이지(OpenCV)

opencvGIF
-> OpenCV 에는 GIF가 없다. 적용하고 싶을때 사용.

Easy to use Wrapper (DLL) for Intel's OpenCV Library with Examples
-> C#용 Wrapper DLL

c#으로 OpenCV하기 카페


VC의 Profiling(프로파일링) 사용과 수행시간 측정 함수사용법(CRunTimeChk)
-> CxImage책의 p.106을 참고. OpenCV책의 p.266을 보면 OpenCV 라이브러리를 이용한 방법도 소개하고 있다.

'프로그래밍 > 영상, 음성' 카테고리의 다른 글

CxImage  (0) 2009.08.19
GDI+ (& CImage)  (0) 2009.07.23
영상처리 관련 조언, 책들...  (0) 2009.07.20
IJL(Intel Jpeg Library)  (1) 2009.04.16
: