warning LNK4099: '~.pdb' PDB를 '~.lib' 또는 '~.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다. 이런 경고가 떠서 컴파일 할때마다 신경이 쓰여요.. ㅠㅠ 왜 이런 에러가 뜨는 거죠? 떠도 괜찮은 건지.. _________________ (만지작 거리는 단계)
warning LNK4099: '~.pdb' PDB를 '~.lib' 또는 '~.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다. 이런 경고가 떠서 컴파일 할때마다 신경이 쓰여요.. ㅠㅠ 왜 이런 에러가 뜨는 거죠? 떠도 괜찮은 건지..
올바른 PDB 정보를 찾지 못할때 그렇습니다. LIB를 만들때 프로그램 디버깅 정보(심볼 및 기타 Debug & Continue 정보)가 LIB 파일에 들어가는 경우와 LIB 파일과 같이 생성되는 PDB 파일에 포함되는 경우가 있습니다.
LIB에 같이 포함되게 하기 위해서는 디버깅 정보를 /Z7 으로 변경하고 C/C++ Command Line 옵션에 /Yd를 수동으로 입력해주는 것으로 해결이 됩니다. 일단 PDB가 생성되기 시작하면 /Z7을 쓰더라도 PDB안에 디버깅 정보가 몰려가기때문에(이건 M$가 신경을 좀 덜써준듯) 이렇게 사용할 경우 LIB 프로젝트에 pch 생성을 사용해서는 안됩니다. pch를 생성하기 위해선 PDB 파일이 만들어져야 하는데 PDB 파일이 있으면 디버깅 정보가 생성되면서 LIB(내의 obj)안에 포함되어지지 않고 무조건 PDB 파일에 기록되게 되어 있습니다.
Edit & Continue 가 지원되도록 디버깅 정보 레벨을 올리면서 디버깅 정보를 배포하기 위해선 컴파일시 생성되는 PDB 파일을 LIB와 같이 위치 시켜야 하는데 LIB 프로젝트는 EXE와 달리 최종 PDB를 모아주지 않기 때문에 /Release/vc70.pdb, /Debug/vc70.pdb 파일들을 사용해야 합니다. 이름이 보기 좋지 않고 obj 파일 내에 이 파일에 대한 절대 경로가 포함되기 때문에 같은 폴더에 ~~~.lib, vc70.pdb 를 같이 넣어주거나 C++ 프로젝트 셋팅을 바꿔서 vc70.pdb를 ~~~.pdb 식으로 이름을 변경해주도록 설정해주는게 좋습니다.
Thanks for the error report - this isn't the first time we've had this request. Unfortunately, we just don't have the resources to address the issue during this product cycle. We will try to revisit the issue in future product cycles.
위와 같은 버그가 있을때!! 해당 PDB 파일에 접근을 못할경우가 대다수 더군요. 그래서 저는 임시로 PDB 파일의 이름을 바꿔줍니다. 이상하게 지우지는 못하면서 이름은 바꿔지더군요. 가끔 정상종료를 못했을 때 다음번 빌드에서 PDB파일에 접근하지 못하는 버그 같은데요. 일단 이름 바꿔주면 괜찮습니다.
설치는 위에서 설명한 "log4cxx 빌드 (Visual Studio 2008)" 의 "1. Download Installation File" 와 "2. Installation" 까지 진행 후
log4cxx 솔루션 파일(log4cxx/projects/log4cxx.dsw) 을 Visual Studio 2010으로 열면 프로젝트 자동변환을 진행하고
아래 데로 변경하면 됩니다. (일단 32bit 기준)
설치 바이너리 버전 : apache-log4cxx-0.10.0.zip, apr-1.4.5-win32-src.zip, apr-util-1.3.12-win32-src.zip, sed-4.2.1-setup.exe
log4cxx\src\main\include\log4cxx/helpers/simpledateformat.h(78): error C2252: 템플릿은 네임스페이스 범위에서만 명시적으로 인스턴스화할 수 있습니다.
LOG4CXX_LIST_DEF(..) 를 class 정의 밖으로 옮긴다. (namespace 정의 안, class 정의 밖)
LOG4CXX_LIST_DEF(ConnectionList, Connection); 의 경우 윗줄의
typedef log4cxx::helpers::SocketPtr Connection; 도 같이 옮긴다.
에러 유형 2. KeySet namespace 관련..
..\src\main\cpp\propertiespatternconverter.cpp(62): error C2039: 'KeySet' : 'log4cxx::spi::LoggingEvent'의 멤버가 아닙니다.
LoggingEvent::KeySet keySet 를 KeySet keySet으로 변경. (namespace 제거)
에러 유형 3. iterator 관련..
..\src\main\cpp\propertiespatternconverter.cpp(64): error C2065: 'const_iterator' : 선언되지 않은 식별자입니다.
#include <iterator> 추가
에러 유형 4. apr, aprutil 링크 에러
library 참조 수동 설정 필요. 아래와 같이 Debug, Release 에 대해 수동 설정. Debug는 LibD, Release는 LibR 폴더에 생성됨.
"log4cxx > 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉토리 " 추가 (Release 모드는 LibD)
..\..\apr\LibD
..\..\apr-util\LibD
..\..\apr-util\xml\expat\lib\LibD
"log4cxx > 프로젝트 속성 > 링커 > 입력 > 추가 종속성 " 추가
apr.lib
aprutil.lib
xml.lib
2. apr 프로젝트
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\.\LibR\apr.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr\LibR\apr-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(apr)이(가) Library의 OutputFile 속성 값(apr-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
apr 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\apr.lib 로 변경. ("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\apr.lib)
3. aprutil 프로젝트
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1151,5): warning MSB8012: TargetPath(..\log4cxx\apr-util\.\LibR\aprutil.lib)이(가) Library의 OutputFile 속성 값(E:\SRC\NewBaseApp\WISM\Library\log4cxx\apr-util\LibR\aprutil-1.lib)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
D:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(1153,5): warning MSB8012: TargetName(aprutil)이(가) Library의 OutputFile 속성 값(aprutil-1)과 일치하지 않습니다. 이로 인해 프로젝트가 잘못 빌드될 수 있습니다. 이를 수정하려면 $(OutDir), $(TargetName) 및 $(TargetExt) 속성 값이 %(Lib.OutputFile)에 지정된 값과 일치해야 합니다.
aprutil 프로젝트 속성의 "라이브러리 관리자 > 일반 > 출력 파일" 을 LibR\aprutil.lib 로 변경. ("일반>대상이름"과 일치 시키기. 디버그 모드는 LibD\aprutil.lib)
4. apr, aprutil, xml 빌드 후 log4cxx 프로젝트 빌드
log4cxx\projects\Debug 에 log4cxx.lib, log4cxx.dll 파일 생성
log4cxx 64 bit은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.
윗 예에서 uafxcwd.lib를 링크 할 때, 링크에러가 났고, 에러를 유발한 유력한 용의자는 uuid.lib입니다. 왜냐면, 계속 다른 애들은 디폴트 경로에서 링크되는데 uuid.lib만 sdk 에서 링크 되었고, MFC에서 new를 재정의 하기 때문에, 이전에 new가 정의되어 있는 파일이 링크되면 안됩니다. 여기서 “stdafx.h”파일을 추가 하는 것을 잊었구나 하는 생각이 듭니다.
/verbose 옵션을 써보지 않으신 분들은 한번 넣고 컴파일을 해보시면 쓰잘떼기 없는 정보까지 주르륵 나와서 놀라실 껍니다. 여러가지 링킹 타임에 하는 작업 정보를 자세히 알려주는 것을 알 수 있습니다. 윗예의 :lib처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.