IT 취미생활.  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'VC++'에 해당하는 글(7)
2009.09.18   /Za, /Ze(언어 확장 사용 안 함)
2008.06.27   "msvcrtd.lib" 링크시 문제
2008.03.28   [Debug] 디버깅시 Symbol Load하는 방법
2008.03.12   vs2005에서 Data breakpoint 사용하는 방법
2008.03.09   Bit 연산을 이용한 Flag 사용하기
2008.03.09   파일명, 라인정보를 보여주는 에러 메세지 박스 만들기 2
2008.03.08   [VC++] Unicode <--> Ansi 변환 간단


/Za, /Ze(언어 확장 사용 안 함)


/Ze 옵션은 Visual C++ 2005에서 사용되지 않습니다. 자세한 내용은 Visual C++ 2005의 사용되지 않는 컴파일러 옵션을 참조하십시오.

아래 링크를 참조 하시면 됩니다.

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



"msvcrtd.lib" 링크시 문제
LNK4098: defaultlib "msvcrtd.lib" conflicts ... 학습중(Windows)

C Run-Time Library는 standard library를 말합니다.

printf, strcpy, malloc, new, cin, cout 등등이  이 라이브러리에 포함됩니다.


종류는 꽤 많은데, 별로 복잡하지는 않습니다.

libc.lib : c언어에 해당하는 라이브러리 입니다. printf, strcpy, malloc 등이 구현되어 있습니다.

libcmt.lib : libc 와 동일합니다만, 이것은 멀티쓰레드 용입니다.

msvcrt.lib : libc 와 동일합니다만, 이것은 dll 용입니다.

               ( 위의 두가지는 static link 로 사용되고, 이것은 dynamic link 로 사용됩니다.)



libcp.lib : c++언어에 해당하는 라이브러리 입니다. cin,  cout, new  등이 구현되어 있습니다.

libcpmt.lib : libcp 와 동일합니다만, 이것은 멀티쓰레드 용입니다.

msvcprt.lib : libcp 와 동일합니다만, 이것은 dll 용입니다.

               ( 위의 두가지는 static link 로 사용되고, 이것은 dynamic link 로 사용됩니다.)



그러므로, 위의 라이브러리는 두개의 그룹중에 하나씩만 포함이 되어야 합니다.

만약, libc 와 msvcrt 가 둘다 링크되면 중복선언 되었다는 에러가 납니다.


하지만, 다른 프로젝트에서 가지고 왔다면, 이러한 링크옵션 수정하는 것이 쉽지 않을 수 있습니다.

프로젝트 구조를 보아야 알 수 있으나, 한가지 해결방법은....


링크에서 메세지에도 나와 있듯이, 링크 옵션에 다음을 추가 하십시오.

/NODEFAULTLIB:library

 

library 에 포함시키지 말아야 할 라이브러리를 추가하시면, 이 라이브러리는 링크에 포함되지 않습니다.

 

그러면, 중복 선언 에러는 해결 할 수 있습니다.



 출처 : Devpia / VC++ / 질문답변 / 572567

작성자 : 김무석(kim790815) 님



[Debug] 디버깅시 Symbol Load하는 방법
VS tools을 사용하여 Debug시 작성한 Dll들 및 기타  system dll에 대한 Symbols를 로드 하는
방법은  아래와 같다.

디버깅중에서

Debug --> Windows --> Modules 템에서 해당 Dll에서 마우스 오른쪽 버튼을 누르고
심볼을 로드 하면 Symbol status가 loaded 상태가 된다.


vs2005에서 Data breakpoint 사용하는 방법

vs2005에서 Data breakpoint 사용하는 방법


이럴때 : 특정 변수 또는 메모리가 변한 상태 --> 어떤 쉐리가 메모리를 밀었을때..!!! 좋음



일단 Data Breakpoint 는 Break 상태에서만 설정할 수 있구요.

1. 일단 변수를 감시하고자 하면 변수의 선언부 정도에다 Breakpoint 를 설정해둡니다.

    혹시 메모리 위치 자체를 감시하실 거라면 아무데나 적절히 거세요 = :)

2. Break 가 걸리면, 메뉴에서(단축키가 없는듯 ?) Debug > New Breakpoint > New Data Breakpoint 를 선택합니다.


3. Address 부분에다가 메모리 주소를 직접 적으시거나 &value 와 같이 변수의 주소를 설정해주시면 알아서 실제 메모리 주소로 치환되어 들어갑니다.

4. Byte Count 는 적절히 감시해야 하는 메모리의 크기를 설정해주시면 되구요.

5. Continue 해서 중단된 녀석을 실행해주면, 실행하다 메모리가 변경되면 냉큼 잡힙니다.

win32 platform에서는 확인 됨




 

확인 해볼 것

1. Smart Device 를 지원하는 확인 해볼 것



Bit 연산을 이용한 Flag 사용하기
윈도우에 보면 항상 윈도우 스타일을 설정 할때 | 를 이용하여 여러개의
bit값을 or를 하게 된다.

예를 들어 아래와 처럼 말이다.
WS_POPUP | WS_CHILD | WS_ ... 이런식으로 BIT OR 연산으로 플래그를 사용한다.
어떤 기능을 수행하는 함수를 만들때 여러가지 옵션에 따라서 수행 방법을 달리 하거나 할때 유용하다.
PlatForm API를 만들때 종종 사용이 된다. 위에서도 언급 했듯이 윈도우 스타일 ~ Popup 스타일등


그런 옵션을 만드는 방법은?

1. bool형 인자를 각각의 옵션 갯수대로 만든다.
   이것은 몇개 없을경우(1,2개 정도)에는 괜찮지만 많아 지면 각각의 옵션마다
   전부다 if를 해야하는 관계로 무척 복잡하다.
   초급용.


2. int형 하나를 만들어서 그 값을 if해서 1,2,3,4로 검출한다.
   이것은 하나의 변수로 여러 옵션을 만들 경우 유용하다.
   그러나 #define을 잘 쓰지 않으면 몇번이 어떤 옵션인지 헷갈린다.
   중급용.


3. dw형(DWORD) 윈도우 스타일 플래그를 만든다.
   반드시 #define과 함께 쓰고 비트 연산을 한다.
   무척 유용하다. 윈도우에서 자주 쓰는 스타일이다.
   고급용이다.


1,2 번은 대충 짐작을 할것이고 3번에 대해서 알아보자.
2번의 경우 각각을 if 하는데 어떤 기능인지 헷갈린다고 했다.
3번 같은 플래그는 일단. 기능별로 분리를 하고 #define을 해야한다.

#define FLAG_AAA 0x001
#define FLAG_BBB 0x002
#define FLAG_CCC 0x004
#define FLAG_DDD 0x008
#define FLAG_EEE 0x010

이런식으로 정의 한다.


우리가 함수에서 플래그를 넣을때
dwFlags = FLAG_AAA | FLAG_BBB | FLAG_CCC;
이렇게 넣었다고 가정해보자.

| 는 비트 OR이므로
FLAG_AAA = 00001
FLAG_BBB = 00010
FLAG_CCC = 00100

이렇게 된다. (이진수로)
다 합치면(OR)하면 00111이다.



그러면 그 인자를 받아서 detect해보는 작업을 하겠다.

if( FLAG_BBB & dwFlags )
이렇게 하면 이 값이 true가 된다.

왜냐?
비트 연산을 한번더 해보면
dwFlags는 이진수로 00111이고.
FLAG_BBB는 이진수로 00010이다.(0x002)
& (AND) 연산을 해보자.
AND는 둘다 1일때만 결과가 1이다.
00111
00010
-----
00010 이 결과이다.
이것은 0보다  큰 값이므로 true가 된다.

우리가 처음에 FLAG_AAA | FLAG_BBB | FLAG_CCC를 했으므로
if( FLAG_DDD & dwFlags )를 해보면..
00111
01000
----- &하면
00000

if의 결과는 false이다.

-0- 기억이 가물 가물한데 내가 썼던 글인가????


파일명, 라인정보를 보여주는 에러 메세지 박스 만들기
 #define 스크립트를 이용하면 쉽게 파일명과 줄번호가 출력되는 메세제 박스를
만들 수 있습니다..

아래 코드를 참조 하세요

코드:
#include <stdio.h>
#include <windows.h>
#include <stdarg.h>
void ShowMessage(const char* strFormat, ...)
{
static char strBuff[512];
va_list args;
va_start(args, strFormat);
vsprintf(strBuff, strFormat, args);
va_end(args);
MessageBox(0, strBuff, "Message", MB_ICONERROR);
}





#define SHOW_ERROR(Msg) {

ShowMessage("%s(%d) %s \n", __FILE__, __LINE__, Msg );
}











#define CHEAK_ERROR(Flg)
{
if (!Flg)
ShowMessage("%s(%d) %d \n", __FILE__, __LINE__, Flg );
}



int main()
{
char* pSzString = NULL;
CHEAK_ERROR(pSzString);
if (s == NULL)
{
SHOW_ERROR(" Error NULL Pointer Here");
}
return 0;
}


*  개인적으로는 Debug Level에 따라서 출력이 되도록 수정하는 것도 좋을 것 같습니다
    또한 가변인자를 활용하여 여러가지의 값을 가지도록 만들어 보아요~!


[VC++] Unicode <--> Ansi 변환 간단
char *szMessage = "Hello World";
wchar_t wszMessage[256] = { 0 };
wsprintfW( wszMessage, L"%S", szMessage );

wchar_t *wszMessage= L"Hello World";
char szMessage[256] = { 0 };
wsprintfA( szMessage, "%S", wszMessage );


BLOG main image
취미생활
 Notice
 Category
분류 전체보기 (191)
매일매일갱생 (83)
서버개발 (1)
임베디드개발 (12)
Programming (80)
Personal Projects (6)
유용한 프로그램 (0)
 TAGS
ISDB-T 서태지 군대 티스토리초대 Java 벨소리 변경 Dshow warning 1seg 출장 english email Debug Windows Mobile6.0 Error Case DVB-T isdbt debugging DirectShow M480 C++ 퇴사 MP3 project C 미라지폰 음식 티스토리 초대장 VC++ 개발자 English spam mail Algorithm DVB 영어 이메일 Wince5.0 Linux 알고리즘 Brazil It
 Calendar
«   2024/04   »
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
 Recent Entries
 Recent Comments
 Recent Trackbacks
 Archive
 Link Site
zextor
괴짜 프로그래머의 일상사~@@
Gag & Peace, and more..
Kazakhstan Almaty.......
Min-A
Sadgarret
Steve Yoon's log
가슴 뛰는 삶을 살아라
오스틴 파워
GUI sin
melanie parker_Lady
제레미의 TV 2.0 이야기..
 Visitor Statistics
Total :
Today :
Yesterday :
rss