여러프로젝트를 사용할때 비주얼스튜디오의 프로젝트설정법

VS로 작업시 여러가지 DLL을 만들어내는 프로젝트와 해당 DLL을 사용하여 EXE를 만들어내는 프로젝트를 하나의 솔루션으로 만들어서 관리하면 무척 편하게 작업이 가능한다.
특정 DLL을 수정시 그 DLL에 종속성이 있는 다른 프로젝트의 DLL 과 EXE 등이 자동으로 필요한 것만 컴파일이 되게도 설정이 가능하다.

EXE가 실행될때 필요한 DLL을 한곳에 모으는 것은 각 프로젝트의 속성을 수정하는 것만드로 가능하다.

우선 하나의 솔루션을 생성하고 각각의 프로제트를 생성한다. 이후 각각의 프로젝트의 OutDir을 설정한다.

사용자 삽입 이미지

위의 속성창에서 처럼 출력디렉토리와 중간 디렉토리를 설정해 주면 (중간 디렉토리 값의 DLL은 해당 프로젝트 명으로)



솔루션디렉토리
    /EXE 프로젝트
    /DLL 프로젝트
    /bin(바이너리 파일들이 남는곳 dll, exe, pdb)
    /Debug/EXE(EXE 프로젝트의 중간 오브젝트 파일들이 생성)
              /DLL(DLL             ”                    ”                   ” )
위와 같은 디랙토리 구조를 이루게 된며, /bin 폴더에 사용할 바이너리 파일들이 모두 모이게 된다.

사용자 삽입 이미지

그리고 위의 프로젝트 종속성을 각각 프로젝트 마다 필요한 DLL등에 설정해주면 자동 컴파일시 자동으로 DLL 이나 lib등을 링크해 주게 된다. (속성창에서 따로 설정해 줄 필요가 없다.)
이렇게 해둘경우 컴파일된 중간 결과나 바이너리를 정리하고 소스만 압축할 경우에도 /bin, /Debug 등만을 지워주면 되니 무척 간편하다. 마지막으로 위의 EXE 프로젝트에서 DLL의 헤더파일을 인클루드 할경우는
#include “../DLL/INCLUDE.h”
이런식으로 하면 된다.

Visual C++ 2005 에서 warning C4996

warning C4996: ‘XXXXXX’이(가) deprecated로 선언되었습니다.

http://lagoons.net/tt/325 에서도 언급했었던 내용인데 메모용 으로 정리해 본다.

우선 의미는  해당 워닝이 발생한 함수를 더 이상 지원하지 않는 다는 의미며 곧 사라질수도 있으니 사용하지 말라는 의미.

가장 많이 발생하는 부분이 CRT 함수들 이다.
fopen 이니 strcpy 하는 함수들의 경우 일반적으로 리턴값을 바로 핸들로 사용하거나 버퍼의 크기를 입력받지 않는다. 요런 부분에서 보안상 문제가 발생할 가능성이 있다고 판단했는지 MS쪽에서 새로운 함수들을 많이 추가해 놨다.

예를 들어 fopen_s 같은 함수들. 위에서 말한것 처럼 리턴값을 파일핸들로 바로 사용하고 NULL 일 경우에만 에러다! 라고 판단하는 방식에서 좀더 개선되어 리턴값은 에러코드를 리턴하고 FILE 핸들은 함수인자로 리턴해 준다.
 

errno_t fopen_s(
  FILE** pFile,
  const char *filename,
  const char *mode
);

errno_t _wfopen_s(
  FILE** pFile,
  const wchar_t *filename,
  const wchar_t *mode
);

이런 느낌!

http://msdn2.microsoft.com/ko-kr/library/ms235425.aspx
에서 기타 다른 정보를 얻을수 있다.

ps.
돌아다니다가 웹에서 알게된 것.
위의 CRT관련 C4996 에러를 신경쓰고 싶지 않을 경우

#define _CRT_SECURE_NO_DEPRECATE

을 추가하면 된다고 한다. (테스트는 안해봤음)
출처는 이곳

BUG: Cannot Display std::string and std::wstring Variables Correctly In Visual C

음 참고로 2003 에서는 정상적으로 되고 2002에서는 안된다.

자세한 내용은
http://support.microsoft.com/default.aspx?scid=kb;EN-US;326616
에 있는데 요약하면 std::string 의 내용이 15자를 넘어가면 디버거에서 정상적으로 값을 볼수 없는 현상이 발생한다는 것이다.

이 내용을 찾아본 이유는 std::stringstream 을 이용해서 문자열을 만들어서 std::string 에 넣을때 어째서 인지 정상적인 값이 들어가지 않아서 이것저것 살펴보다가 std::string 의 맴버변수중에 _Ptr 에는 내가 원한 정상적인 문자열이 들어있는데 실제로 찍어주는 애들은 _Buf에 있는 문자라서 어찌어찌 찾아보게 되었다.
위의 문서의 경우는 디버거에서만 문제가 발생하는거라 했으니 내가 처했던 문제는 아마 또 다른 에러가 있지 않았을까 하지만… 이것저것 수정하다가
“크아 닝기미! 리빌드닷!”
하고 리빌드 했더니 정상적으로 출력이 되서…. 무척 허무해 하고 있는 중이다.

음 비주얼 스튜디오 2002는 조만간 안쓰게 될 예정이지만(회사에서도 내가 하고 있는 프로젝트에서 나혼자만 쓰고 있다.) 어쨋거나 메모.

warning C4100: unreferenced formal parameter

오늘 ECMiner 에서 일부 프로젝트를 워닝레벨4로 올려서 빌드를 해봤는데 새롭게 나타나는 워닝중 일부가 함수의 매개변수로 선언은 되어있지만 함수내부에서 사용하지 않는 것을 워닝으로 알려주는것이 있었다.

흠~ 내가 짠 코드의 경우는 이런 워닝이 뜬다면 함수자체를 수정해 주면 되지만 다른 사람이 짠 코드는 막무가내로 수정하기 뭐할뿐더러 추상클래스인 경우도 있고 자식 클래스도 이런 경우가 있을것 같다.

이런 경우 수정하자니 뭐시기 하고 내비두자니 워닝이 거슬린다.
해결책은 함수 정의부분의 변수’‘ 을 선언한 부분만 주석처리하면 된다.

void CMakeTreeDoc::SetModifiedFlag(BOOL bModified ) { }

이걸
void CMakeTreeDoc::SetModifiedFlag(BOOL /*bModified*/ ) { }

이렇게 하면 워닝도 안뜨고 이후 상속 관련해서도 문제가 없다.

ps. http://lagoons.net/wiki/wiki.php/WarningLevel4 에 관련 내용을 적었다.