정리

gtest VS2012에서 에러 - error C2977: 'std::tuple' : too many template arguments

저장소/VC++

좋은 정리 감사해서 긁어왔습니다.


원문 출처 : http://kbdyj.tistory.com/30



2010에서 GTEST를 쓰는 프로젝트를 2012로 옮겨와 빌드하니 에러가 발생.


error C2977: 'std::tuple' : too many template arguments 라는 내용인데 2012에서 아직 variadic template를 지원하지 않는다는게 원인인 것 같다.


이 방법을 해결하는 방법이 두가지 인데


첫째 옵션에서 C/C++>Preprocessor>Preprocessor Definitions에서

GTEST_HAS_TR1_TUPLE=0

을 주어 빌드하거나


두번째로 Configuration Properties>General>Platform Toolset을 Visual Studio 2010(v100)으로 맞춰놓고 빌드하는 것이다.


첫번째 방법으로 했다가 GTEST 자체를 2010으로 빌드한 것을 가져다 썼더니 링크에러가 나서 두번째 방법으로 해결하였다. (GTEST를 다시 빌드하기 귀찮아서)



warning LNK4099

저장소/VC++

정리 잘 되어있는 블로그

http://altprog.com/blog/2054



다음 내용은 gpg 링크가 종종 깨지거나 없어지는듯...은 핑계고 링크 따라가기 귀찮아서 긁어왔다.

출처 : http://www.gpgstudy.com/forum/viewtopic.php?p=91716



  

글쓴이메시지
idlast



가입: 2007년 2월 12일
올린 글: 17

올리기warning LNK4099 이 경고 메시지는 무엇인가요?올려짐: 2007-02-21 10:59
인용과 함께 답변 이 게시물을 del.icio.us에 추가

warning LNK4099: '~.pdb' PDB를 '~.lib' 또는 '~.pdb'에서 찾을 수 없습니다. 디버그 정보가 없는 것처럼 개체를 링크합니다. 
이런 경고가 떠서 컴파일 할때마다 신경이 쓰여요.. ㅠㅠ 
왜 이런 에러가 뜨는 거죠? 
떠도 괜찮은 건지.. 
_________________
(만지작 거리는 단계)
위로


Rica



가입: 2004년 8월 9일
올린 글: 86

올리기올려짐: 2007-02-21 11:05
인용과 함께 답변 이 게시물을 del.icio.us에 추가

디버그 모드에서 디버그 정보를 포함하지 않은 라이브러리를 함께 링크하려고 하면 아마 저럴 겁니다. 
아니면 라이브러리 빌드한 경로가 잘못되었거나.. 

라이브러리 안으로 들어가서 디버깅하시지 않는다면 신경 안 쓰셔도 될 거라고 생각합니다.
위로


zupet



가입: 2003년 5월 13일
올린 글: 2761
소속: EA Seoul Studio

올리기Re: warning LNK4099 이 경고 메시지는 무엇인가요?올려짐: 2007-02-21 13:16
인용과 함께 답변 이 게시물을 del.icio.us에 추가

idlast 씀:
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 식으로 이름을 변경해주도록 설정해주는게 좋습니다.
위로


비회원
손님





올리기흠.. 에러를 단순히 무시하는 방법은 없나요?올려짐: 2007-02-27 10:41
인용과 함께 답변 이 게시물을 del.icio.us에 추가

디버그 버전에서 디버깅 정보가 없는 lib (외부 lib 등) 를 사용할때도 
자꾸 4099 워닝이 떠서 은근히 거슬리는데 그냥 무시해버리는 방법은 없을까요? 

googling 을 하면 link 커맨드라인에 "/IGNORE:4099" 의 식으로 주면 해결된다고 하는데, 
(undocumented option 이라고 하는군요) 
저렇게 해도 해결이 되지 않네요.
위로


liteplayer



가입: 2003년 10월 30일
올린 글: 43

올리기올려짐: 2007-02-27 10:55
인용과 함께 답변 이 게시물을 del.icio.us에 추가

안녕하세요? 

라이브러리 링크를 소스에 명시할 경우(#prgma comment\(lib,""\)) 에는 
#pragma warning(disable: xxxx) 이 되는걸로 알고있습니다.
위로


비회원
손님





올리기올려짐: 2007-02-27 11:27
인용과 함께 답변 이 게시물을 del.icio.us에 추가

답변 갑사합니다. 

#pragma warning(disable: ####) 는 컴파일러 워닝만 무시해주는데, 
링커의 워닝을 무시하고 싶습니다. 

구글링 해서 나온 방법대로 
추가 command line 옵션에 /IGNORE:4099 -IGNORE:4099 를 붙여봐도 되지 않고 
혹시나 하는 마음에 

#pragma comment(lib, "/IGNORE:4099") 

를 해봐도 되지 않는군요.
위로


비회원
손님





올리기올려짐: 2007-12-13 16:10
인용과 함께 답변 이 게시물을 del.icio.us에 추가

같은문제로 고민했습니다만, 친절히도 

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. 

요런답변을 MS로 부터 얻을수 있었습니다. -_- 

http://connect.micr...px?FeedbackID=176188
위로


milennium9



가입: 2007년 2월 1일
올린 글: 71

올리기올려짐: 2007-12-20 17:38
인용과 함께 답변 이 게시물을 del.icio.us에 추가

위와 같은 버그가 있을때!! 해당 PDB 파일에 접근을 못할경우가 대다수 더군요. 그래서 저는 임시로 PDB 파일의 이름을 바꿔줍니다. 
이상하게 지우지는 못하면서 이름은 바꿔지더군요. 
가끔 정상종료를 못했을 때 다음번 빌드에서 PDB파일에 접근하지 못하는 버그 같은데요. 일단 이름 바꿔주면 괜찮습니다.
위로


log4cxx - Visual Studio 빌드

저장소/VC++

Visual Studio 2012에서 log4cxx를 빌드할 때 한 번에 쉽게 되지가 않더라.. ㅠㅠ
좋은 내용이 있어서 담아본다. 아래 내용 참고.




log4cxx
log4j 를 본따 c++ 버전으로 만든 ASF(http://apache.org/)의 OSS.
(log4j 메뉴얼을 참조해도 된다. 거의 비슷..)

로그 레벨 : ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF



log4cxx 빌드 (Visual Studio 2008)


1. Download Installation File
Apache log4cxx  [ver 0.10.0]
Apache Portable Runtime (APR) [ver 1.4.2]
Apache Portable Runtime-util (APR-util) [ver 1.3.10]
GNU Sed [ver 4.2]

2. Installation
1. Decompress APR, APR-util, log4cxx File in same folder
ex) 아래와 같이 폴더 이름 변경 필수
c:\work\log4cxx\apr
c:\work\log4cxx\apr-util
c:\work\log4cxx\log4cxx
2. Install GNS sed 
Run "sed-4.2-1-setup.exe"
Add environment variable %PATH% : "C:\Program Files\GnuWin32\bin" 
3. In "cmd", move "C:\work\log4cxx\log4cxx" folder.
Run "configure.bat"
Run "configure-aprutil.bat"
4. Compile "C:\work\log4cxx\log4cxx\projects\log4cxx.dsw"
Result : log4cxx.dll, log4cxx.lib
("C:\work\log4cxx\log4cxx\projects\Debug or Release")
5. include file
C:\work\log4cxx\log4cxx\src\main\include
3. Visual Studio 2008 에서 사용하기 위한 설정 configuration
in Project Property Pages
"C/C++ > General > Additional Include Directories" : C:\work\log4cxx\log4cxx\src\main\include
"C/C++ > Linker > Additional Library Directories" : C:\work\log4cxx\log4cxx\projects\Debug
In .cpp
#pragma warning ( disable: 4231 ) 
#pragma comment(lib, "log4cxx.lib")
Log4cxx 용 (properties 설정 파일)


[log4cxx.conf]
# root logger setting
#log4j.rootLogger=DEBUG, console, filelog, chainsaw, rollingfile
log4j.rootLogger=DEBUG,filelog, console

# using console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%-5p] %c(%L) : %m%n
#log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n


# using rolling file appender
log4j.appender.rollingfile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingfile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingfile.File=Rlog.txt
log4j.appender.rollingfile.layout.ConversionPattern=[%d] [%-5p] (%L) - %m%n
log4j.appender.rollingfile.MaxFileSize=500MB
log4j.appender.rollingfile.MaxBackupIndex=3

# using filelog appender
log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout
log4j.appender.filelog.layout.ConversionPattern=[%d] [%-5p] (%L) - %m%n
log4j.appender.filelog.Append=true
log4j.appender.filelog.DatePattern='.'yyyy-MM-dd
log4j.appender.filelog.File=testlog.log

# using chainsaw appender
log4j.appender.chainsaw=org.apache.log4j.net.SocketAppender
log4j.appender.chainsaw.remoteHost=localhost
log4j.appender.chainsaw.port=4445
log4j.appender.chainsaw.locationInfo=true 

[.cpp]
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;

#pragma warning ( disable: 4231 ) 
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>

#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;

int main(void)
{
try
{
string filePath = "log4cxx.conf";
PropertyConfigurator::configure(File(filePath));

LoggerPtr rootlog = Logger::getRootLogger();
LoggerPtr log = Logger::getLogger("");

LOG4CXX_FATAL(log, "fatal output...");
LOG4CXX_ERROR(log, "error output...");
LOG4CXX_WARN (log, "warn  output...");
LOG4CXX_INFO (log, "info  output...");
LOG4CXX_DEBUG(log, "debug output...");
}
catch(const Exception& e) {
cout << "[ERROR] configure()\n" << e.what() << endl;
}

return EXIT_SUCCESS;
} 

#pragma warning ( disable: 4231 )
컴파일시 다음 warning 보기 싫어서 넣음. c:\work\log4cxx\log4cxx\src\main\include\log4cxx\spi\configurator.h(57) : warning C4231: nonstandard extension used : 'extern' before template explicit instantiation 



Log4cxx - 사용 (xml 설정 파일)

[log4cxx.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="logConsoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
  <appender name="logRollingFileAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="file" value="TestRolling500MB.log" />
    <param name="append" value="true" />
    <param name="MaxFileSize" value="500MB" />
    <param name="MaxBackupIndex" value="3" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
aadafasf
  <appender name="logTimeRollingFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="fileNamePattern" value="TestTimeRolling.%d{yyyy-MM-dd}.log"/> <!--Dailly-->
    </rollingPolicy>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ISO8601} [%-5p] [%c:%L] %m%n"/>
    </layout>
  </appender>
  
  <root>
    <level value="debug" />
    <appender-ref ref="logConsoleAppender"/>
    <appender-ref ref="logRollingFileAppender"/>
    <appender-ref ref="logTimeRollingFileAppender"/>
  </root>

  <category name="testCategory" >
    <level value ="info" />
    <appender-ref ref="logTimeRollingFileAppender"/>
  </category>

</log4j:configuration> 

[.cpp]
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;

#pragma warning ( disable: 4231 ) 
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/xml/domconfigurator.h>

#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::xml;

int main(void)
{
try
{
string filePath = "log4cxx.conf";
DOMConfigurator::configure(filePath);

LoggerPtr rootlog = Logger::getRootLogger();
LoggerPtr log = Logger::getLogger("");

LOG4CXX_FATAL(log, "fatal output...");
LOG4CXX_ERROR(log, "error output...");
LOG4CXX_WARN (log, "warn  output...");
LOG4CXX_INFO (log, "info  output...");
LOG4CXX_DEBUG(log, "debug output...");
}
catch(const Exception& e) {
cout << "[ERROR] configure()\n" << e.what() << endl;
}

return EXIT_SUCCESS;
} 

**. log4cxx 사용법 reference
http://joygram.org/wiki/doku.php?id=log4cxx log4cxx 파일 안의 test 소스  



Log4cxx - 개인용 샘플

[사용]
#include "LoggerManager.h"

int main(void)
{
wstring xmlfilepath = _T("log4cxx.xml");
try
{
CLoggerManager::initialize(xmlfilepath);
}
catch (const Exception& e)
{
cout << "[ERROR] " << e.what() << endl;
}

CLogger logger = CLoggerManager::getRootLogger();
if (logger.isDebugEnabled())
logger.debug(wstring(_T("hi")));

return 0;
}
 




Visual Studio 2010 에서 log4cxx 빌드

설치는 위에서 설명한 "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
1. log4cxx 프로젝트
에러 유형 1. LOG4CXX_LIST_DEF 정의 관련..
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은 컴파일 구성 추가 후 빌드하면 된다는 것 같은데 아직 안해봤습니다.

Visual C++ (2012) 링커 옵션

저장소/VC++

원문 출처 : MSDN magazin (http://technet.microsoft.com/ko-kr/query/y0zzbyt4)



링커 옵션

LINK는 COFF(Common Object File Format) 개체 파일과 라이브러리를 링크하여 실행 파일(.exe)이나 DLL(동적 연결 라이브러리)을 만드는 도구입니다.

다음 표에서는 LINK.exe의 모든 옵션 목록을 보여 줍니다. 이 단원에는 다음 항목에 대한 정보도 포함되어 있습니다.

명령줄에 지정되는 링커 옵션은 대/소문자를 구분하지 않습니다. 즉, /base와 /BASE는 동일하게 취급됩니다.

일부 링커 옵션은 comment pragma를 사용하여 지정할 수 있습니다.

옵션

목적

@

지시 파일을 지정합니다.

/ALIGN

각 섹션의 정렬 방식을 지정합니다.

/ALLOWBIND

DLL을 바인딩할 수 없도록 지정합니다.

/ALLOWISOLATION

매니페스트 조회 동작을 지정합니다.

/ASSEMBLYDEBUG

관리되는 이미지에 DebuggableAttribute를 추가합니다.

/ASSEMBLYLINKRESOURCE

관리되는 리소스에 대한 링크를 만듭니다.

/ASSEMBLYMODULE

MSIL(Microsoft Intermediate Language) 모듈을 어셈블리로 가져오도록 지정합니다.

/ASSEMBLYRESOURCE

관리되는 리소스 파일을 어셈블리에 포함시킵니다.

/BASE

프로그램의 기준 주소를 설정합니다.

/CLRIMAGETYPE

CLR 이미지의 형식(IJW, pure 또는 safe)을 설정합니다.

/CLRSUPPORTLASTERROR

P/Invoke 메커니즘을 통해 호출한 함수의 마지막 오류 코드를 저장합니다.

/CLRTHREADATTRIBUTE

CLR 프로그램의 진입점에 적용하려는 스레드 특성을 지정합니다.

/CLRUNMANAGEDCODECHECK

/CLRUNMANAGEDCODECHECK는 링커가 생성하여 관리 코드에서 네이티브 DLL로 호출되는 PInvoke 스텁에 링커가 SuppressUnmanagedCodeSecurity 특성을 적용할지 여부를 지정합니다.

/DEBUG

디버깅 정보를 만듭니다.

/DEF

모듈 정의 파일(.def)을 링커에 전달합니다.

/DEFAULTLIB

외부 참조를 확인할 때 지정된 라이브러리를 검색합니다.

/DELAY

DLL의 지연 로드를 제어합니다.

/DELAYLOAD

지정된 DLL을 지연 로드시킵니다.

/DELAYSIGN

어셈블리에 부분적으로 서명합니다.

/DLL

DLL을 빌드합니다.

/DRIVER

Windows NT 커널 모드 드라이버를 만듭니다.

/DYNAMICBASE

로드할 때 Windows Vist의 ASLR(Address Space Layout Randomization) 기능을 사용하여 임의로 기준 주소를 지정할 수 있는 실행 가능 이미지를 생성할지 여부를 지정합니다.

/ENTRY

시작 주소를 설정합니다.

/errorReport

내부 링커 오류를 Microsoft에 보고합니다.

/EXPORT

함수를 내보냅니다.

/FIXED

기본 기준 주소에서만 로드할 수 있는 프로그램을 만듭니다.

/FORCE

확인되지 않거나 기호가 두 번 이상 정의된 경우에도 링크를 완료하도록 합니다.

/FUNCTIONPADMIN

핫 패치할 수 있는 이미지를 만듭니다.

/HEAP

힙 크기를 바이트 단위로 설정합니다.

/IDLOUT

.idl 파일과 기타 MIDL 출력 파일의 이름을 지정합니다.

/IGNOREIDL

특성 정보가 .idl 파일로 처리되지 않도록 합니다.

/IMPLIB

기본 가져오기 라이브러리 이름을 무시합니다.

/INCLUDE

기호 참조를 강제 적용합니다.

/INCREMENTAL

증분 링크를 제어합니다.

/KEYCONTAINER

어셈블리에 서명할 키 컨테이너를 지정합니다.

/KEYFILE

어셈블리에 서명할 키 또는 키 쌍을 지정합니다.

/LARGEADDRESSAWARE

응용 프로그램에서 2GB 이상의 주소를 지원하도록 컴파일러에 지시합니다.

/LIBPATH

사용자가 환경 라이브러리 경로를 재정의할 수 있도록 합니다.

/LTCG

링크 시간 코드 생성을 지정합니다.

/MACHINE

대상 플랫폼을 지정합니다.

/MANIFEST

side-by-side 매니페스트 파일을 만듭니다.

/MANIFESTDEPENDENCY

매니페스트 파일에 <dependentAssembly> 섹션을 지정합니다.

/MANIFESTFILE(매니페스트 파일 이름 지정)

매니페스트 파일의 기본 이름을 변경합니다.

/MANIFESTUAC

프로그램 매니페스트에 UAC(사용자 계정 컨트롤) 정보를 포함할지 여부를 지정합니다.

/MAP

맵 파일을 만듭니다.

/MAPINFO

지정한 정보를 맵 파일에 포함시킵니다.

/MERGE

섹션을 결합합니다.

/MIDL

MIDL 명령줄 옵션을 지정합니다.

/NOASSEMBLY

.NET Framework 어셈블리를 만들지 않습니다.

/NODEFAULTLIB

외부 참조를 확인할 때 모든 또는 지정한 기본 라이브러리를 무시합니다.

/NOENTRY

리소스 전용 DLL을 만듭니다.

/NOLOGO

시작 배너를 표시하지 않습니다.

/NXCOMPAT

실행 파일을 Windows 데이터 실행 방지 기능과 호환되는지 테스트한 것으로 표시합니다.

/OPT

LINK 최적화를 제어합니다.

/ORDER

COMDAT을 미리 결정된 순서로 이미지에 배치합니다.

/OUT

출력 파일 이름을 지정합니다.

/PDB

PDB(프로그램 데이터베이스) 파일을 만듭니다.

/PDBALTPATH

대체 위치를 사용하여 PDB 파일을 저장합니다.

/PDBSTRIPPED

전용 기호가 없는 PDB(프로그램 데이터베이스) 파일을 만듭니다.

/PGD

프로필 기반 최적화를 위한 .pgd 파일을 지정합니다.

/PROFILE

성능 도구 프로파일러와 함께 사용할 수 있는 출력 파일을 생성합니다.

/RELEASE

.exe 헤더의 체크섬을 설정합니다.

/SAFESEH

이미지에 안전한 예외 처리기 테이블이 포함되도록 지정합니다.

/SECTION

섹션의 특성을 재정의합니다.

/STACK

스택 크기를 바이트 단위로 설정합니다.

/STUB

MS-DOS 스텁 프로그램을 Win32 프로그램에 연결합니다.

/SUBSYSTEM

운영 체제에 .exe 파일의 실행 방법을 지정합니다.

/SWAPRUN

운영 체제에서 링커 출력을 실행하기 전에 스왑 파일로 복사하도록 지정합니다.

/TLBID

링커에서 생성한 형식 라이브러리의 리소스 ID를 지정할 수 있도록 합니다.

/TLBOUT

.tlb 파일과 기타 MIDL 출력 파일의 이름을 지정합니다.

/TSAWARE

터미널 서버에서 실행하도록 디자인된 응용 프로그램을 만듭니다.

/VERBOSE

링커 진행 메시지를 표시합니다.

/VERSION

버전 번호를 할당합니다.

/WX

링커 경고를 오류로 처리합니다.

자세한 내용은 컴파일러 제어 LINK 옵션을 참조하십시오.


error LNK2005 - uafxcw.lib, LIBCMT.lib

저장소/VC++


다음과 같은 문제가 발생.


1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)이(가) LIBCMT.lib(new.obj)에 이미 정의되어 있습니다.

1>uafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)이(가) LIBCMT.lib(delete.obj)에 이미 정의되어 있습니다.


C Runtime Library와 MFC Library의 import 순서에 의한 링크시 오류라고 한다.

일단 해결 방법은 다음과 같이 하여 import 순서를 변경해주면 되겠다.


프로젝트 속성 -> 링커 -> 입력 -> 특정 기본 라이브러리 무시 : uafxcwd.lib; libcmtd.lib

프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성 : uafxcwd.lib; libcmtd.lib


링크 옵션 /verbose:lib 를 통해 설정 전후의 Library Import 순서를 확인할 수 있다.

설정 전
1>  라이브러리를 검색하고 있습니다.
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\LIBCMTD.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\uafxcwd.lib 검색 중:
1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)이(가) LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.
1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z)이(가) LIBCMTD.lib(dbgdel.obj)에 이미 정의되어 있습니다.
1>      C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib 검색 중:
...

설정 후
1>  라이브러리를 검색하고 있습니다.
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\lib\uafxcwd.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcmtd.lib 검색 중:
1>      C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\OLDNAMES.lib 검색 중:
1>      C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x86\kernel32.lib 검색 중:


그러하다!


[펌] 링크시 나는 에러 추적 하기

저장소/VC++

원문 출처 : 샤방샤방님 블로그(http://blog.naver.com/drvoss/20064150564)



짜증나는 워닝과 에러 중에헤더파일 순서에 따라 발생하는 워닝/에러가 있습니다특히 링크타임에 나는 에러는 네이밍 모양새가 재밌게 생겨먹지 않은 스타일로 생기는 데다가 링커가 별로 힌트를 주지 않아서 짜증이 나기도 합니다예를 들면 아래와 같은 겁니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

 

위 예는 MFC프로젝트에서 모든 파일에서 MFC 헤더를 다른 헤더 보다 먼저 선언해야 하는데(대부분 stdafx.h를 가장 상위에 선언합니다.),  MFC 프로젝트에서 사용하던 파일을 Import 하고 컴파일 하는 순간 발생했습니다.

 

이런 에러의 경우 대처법은 의외로 간단 합니다일단 똑똑고 기억력 좋으신 분들은 자기가 했던 행위들의 콜스택을 하나하나 거슬러 올라가시면서 대처 하는법이 있고이게 가장 비용대비 시간단축 효가가 가장 좋습니다.

 

순간 욱해서 콜스택 거슬러 올라가기 힘드신 (저 같은;;)분들은 아래처럼 대처 하시면 됩니다먼저 링커 옵션에 아래 옵션을 추가 합니다.

 

/verbose:lib

 

 

그리고 다시 빌드 하면 링킹타임에 library를 스캔하는 리스트가 아래와 같이 output창에 나오게 됩니다.

 

1>Generating Code...

1>Compiling resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Compiling manifest to resources...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation.  All rights reserved.

1>Linking...

1>Searching libraries

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\DelayImp.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\LIBCMTD.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\OLDNAMES.lib:

1>    Searching C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\uafxcwd.lib:

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)

1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\kernel32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\user32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\gdi32.lib:

1>    Searching C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib\uuid.lib:

 

윗 예에서 uafxcwd.lib를 링크 할 때링크에러가 났고에러를 유발한 유력한 용의자는 uuid.lib입니다왜냐면계속 다른 애들은 디폴트 경로에서 링크되는데 uuid.lib만 sdk 에서 링크 되었고, MFC에서 new를 재정의 하기 때문에이전에 new가 정의되어 있는 파일이 링크되면 안됩니다여기서 “stdafx.h”파일을 추가 하는 것을 잊었구나 하는 생각이 듭니다.

 

/verbose 옵션을 써보지 않으신 분들은 한번 넣고 컴파일을 해보시면 쓰잘떼기 없는 정보까지 주르륵 나와서 놀라실 껍니다. 여러가지 링킹 타임에 하는 작업 정보를 자세히 알려주는 것을 알 수 있습니다. 윗예의 :lib처럼 뒷부분에 세부 옵션을 붙여 보기 좋게 정보를 추출하는 작업이 익숙해 지면 일반적인 컴파일시 정보를 잘 제공해주지 않는 링킹 타임시 발생하는 에러에 정보를 얻어 디버깅 작업 시간을 단축 시킬 수 있습니다.


CDHtmlDialog, CHtmlView에서 IE 엔진 버전 고르기

저장소/VC++

관련 링크들

http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation

http://www.codewrecks.com/blog/index.php/2011/06/06/witch-version-of-browser-is-used-by-the-webbrowser-control/

http://blogs.msdn.com/b/ie/archive/2008/03/18/webbrowser-control-rendering-modes-in-ie8.aspx

http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx



정리하기 귀찮아서 퍼온 내용은 아래에 ㅜㅜ


원문 출처 : http://codemuri.tistory.com/752




IE8, 9 가 출시되었음에도 불구하고 CHtmlView 와 CDHtmlDialog 의 MSHTML 엔진 버전은 6 또는 7 버전을 사용합니다. MSDN 에는 호환성의 이유로  디폴트로 IE7 Standards Mode 로 실행된다고 명시하고 있습니다.

다음 방법을 이용하여 MSHTML 엔진의 버전을 IE8 또는 IE9 로 명시할 수 있습니다.

HTML 문서에 지정하는 방법

아래처럼 html 에 meta 태그를 선언하면 됩니다.

1
2
3
4
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=9" >


레지스트리를 이용하는 방법

IE8 Standards Mode 로 실행하는 방법 (IE9 는 9000 입니다)

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8000 (Hex: 0x1F40)


IE7 Standards Mode 로 실행하는 방법

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 7000 (Hex: 0x1B58)


IE8 Standards Mode 로 강제하는 방법

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8888 (Hex: 0x22B8)

4K, 64K, 1MB, 1GB, 2GB의 DWORD 표현

저장소/VC++

원문 출처 : http://callibri.egloos.com/2674940


4K                      0x00001000

64K                   0x00010000

 

1MB                  0x00100000

 

1GB                   0x40000000

2GB                   0x80000000


예를 들어, 0x0000bad4라는 값이 win32의 no-access region 중 하나인 0~64K 영역(정확히는 0x00000000~0x0000ffff)에 속하는가 아닌가를 금방 알려면 위 표현을 외워 놓는.

Stack Overflow 사례

저장소/잡다한거
원문 출처 : http://callibri.egloos.com/2801476


Stack Overflow발생하는경우를본다.  

(Demo: StackOverflow.exe 예제)

 

Unknown software exception (0xc00000fd)같은exception발생할있는데이때windbg연결한다

 

0:000> kL

ChildEBP RetAddr 

0003bba0 00401091 StackOverflow!_chkstk+0x27

00054264 00401091 StackOverflow!StackOverflow+0x91

0006c928 00401091 StackOverflow!StackOverflow+0x91

00084fec 00401091 StackOverflow!StackOverflow+0x91

0009d6b0 00401091 StackOverflow!StackOverflow+0x91

000b5d74 00401091 StackOverflow!StackOverflow+0x91

000ce438 00401091 StackOverflow!StackOverflow+0x91

000e6afc 00401091 StackOverflow!StackOverflow+0x91

000ff1c0 00401091 StackOverflow!StackOverflow+0x91

00117884 00401091 StackOverflow!StackOverflow+0x91

0012ff48 004010fa StackOverflow!StackOverflow+0x91

0012ff54 00401803 StackOverflow!main+0xa

0012ffb8 004015cd StackOverflow!__tmainCRTStartup+0x233

0012ffc0 77e6f23b StackOverflow!mainCRTStartup+0xd

0012fff0 00000000 kernel32!BaseProcessStart+0x23

 

같은함수명이recursive하게반복되므로stack overflow라는것을쉽게짐작할있다, stack framerecursive 함수호출을통해grow하다보면stack size초과했을것이다또한_chkstkstack 문제임을나타낸다.

디폴트로threadstack size1MB이다threadstack baselimit어떤가체크하려면thread environment block본다

 

0:000> !teb

TEB at 7ffdd000

    ExceptionList:        0012ffa8

    StackBase:            00130000

    StackLimit:           00031000

    SubSystemTib:         00000000

    FiberData:            00001e00

    ArbitraryUserPointer: 00000000

    Self:                 7ffdd000

    EnvironmentPointer:   00000000

    ClientId:             000018ec . 00001f84

    RpcHandle:            00000000

    Tls Storage:          00000000

    PEB Address:          7ffde000

    LastErrorValue:       0

    LastStatusValue:      c0000034

    Count Owned Locks:    0

    HardErrorMode:        0

 

Frame간의크기를보려면kf사용한다

 

0:000> kfL

  Memory  ChildEBP RetAddr 

          0003bba0 00401091 StackOverflow!_chkstk+0x27

    186c4 00054264 00401091 StackOverflow!StackOverflow+0x91

    186c4 0006c928 00401091 StackOverflow!StackOverflow+0x91

    186c4 00084fec 00401091 StackOverflow!StackOverflow+0x91

    186c4 0009d6b0 00401091 StackOverflow!StackOverflow+0x91

    186c4 000b5d74 00401091 StackOverflow!StackOverflow+0x91

    186c4 000ce438 00401091 StackOverflow!StackOverflow+0x91

    186c4 000e6afc 00401091 StackOverflow!StackOverflow+0x91

    186c4 000ff1c0 00401091 StackOverflow!StackOverflow+0x91

    186c4 00117884 00401091 StackOverflow!StackOverflow+0x91

    186c4 0012ff48 004010fa StackOverflow!StackOverflow+0x91

        c 0012ff54 00401803 StackOverflow!main+0xa

       64 0012ffb8 004015cd StackOverflow!__tmainCRTStartup+0x233

        8 0012ffc0 77e6f23b StackOverflow!mainCRTStartup+0xd

       30 0012fff0 00000000 kernel32!BaseProcessStart+0x23

 

StackOverflow!StackOverflow 한번호출시framedistance186c4, 십진수로100036(100K못미치는)이다. Local vars정도를쓰는것이다이를열번정도호출하면1MB가깝다.

 

Stack overflow인지 확인방법은stack현재어느만큼쓰고있고limit도달했는지확인하는것이다.

이를계산하기전에, 일반적인 stack구조를보자

+------------------------------------------------+   TEB 구조체의DeallocationStack가리키는주소 

                     BOTTOM/RSV

+------------------------------------------------+   < ---------- 근접하게되면Stack Overflow!!

 

                                ………..

 

 

+------------------------------------------------+

                     RESERVE 페이지

+------------------------------------------------+

                       GUARD 페이지

+------------------------------------------------+   StackLimit 

                     TOP/COMMIT 페이지

+------------------------------------------------+    StackBase 

 

아래가주소이고위는작은주소의방향일때이다스택은주소에서작은주소방향으로커간다.

그래서그림상가장하단의주소가StackBase이고실행시처음COMMIT페이지에서작은주소방향으로다음페이지를COMMIT하면서계속커나갈있다. StackLimit현재stack경계선을나타낸다그러므로현재의stack 크기는StackBase에서StackLimit만큼의차이이다(StackBase쪽이주소이므로StackBase에서StackLimit뺀다)

Windows SDKntpsapi.h 파일에정의된TEB 구조체의DeallocationStackStackmaximum size때의주소를가리킨다그러나stack커나가더라도DeallocationStack까지도달할있는것은아니고DeallocationStack마지막페이지에근접하면stack overflow발생하게된다.

 

!teb에서보인StackBaseStackLimit로써stack size계산한다.

    StackBase:            00130000

    StackLimit:           00031000

 

0:000> ?130000-31000

Evaluate expression: 1044480 = 000ff000

거의1MB달한다는것을있다.

 

Stack도달할있는maximum stack size어떻게될까? StackBase에서DeallocationStack차이를보면된다.

DeallocationStack_TEB 구조체를분석하면e0xoffset가진다. (계산방법생략)

 

0:000> dd 7ffdf000+e0c L1

7ffdfe0c  00030000

 

0:000> ?130000-00030000

Evaluate expression: 1048576 = 00100000

예상대로maximum stack size1MB이다.

 

Maximum stack size마지막페이지는31000에서30000이다.

 

0:000> r esp

esp=0003bb98

거의31000근접하였으므로stack overflow발생하였음을있다.

 

해결방법은잘못된recursive function 콜을바로잡거나(recursive function영원히호출되지않도록끝나는조건지정)

Stack디폴트사이즈를늘려준다좋은것은메모리할당에있어서stack보다는heap 영역을쓰는것이다.

 

<><><> 

Stack Overflow디버깅방법은다음MSDN참조하면좋다.

http://msdn.microsoft.com/en-us/library/cc267849.aspx

 

user-mode에서의Stack overflowrecursion 의해주로발생하는reserved stack 영역을경우가아닌다른원인이있는예제를보여준다.

 

stack overflow is an error that user-mode threads can encounter. There are three possible causes for this error:

  • A thread uses the entire stack reserved for it. This is often caused by infinite recursion.
  • A thread cannot extend the stack because the page file is maxed out, and therefore no additional pages can be committed to extend the stack.
  • A thread cannot extend the stack because the system is within the brief period used to extend the page file.



심볼서버(Symbol Server)

저장소/잡다한거

내용 정리는 언젠가...

잘 정리된 내용은 아래 링크로~


http://serious-code.net/moin.cgi/SymbolServer

http://blog.devgrapher.com/70088030226

정리 종결 : http://www.cyworld.com/sjh0628/7453266

PDB 관리 : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&wid=321

소스 서버는 언제?


OS 심볼은 패스~


symstore.exe 활용 : 빌드 후 이벤트로 걸어두면 되겠다.(windbg 경로에 있음)

symstore add /r /f [심볼파일을 가져올 경로]\*.* /s [심볼파일들을 저장할 경로] /t "[제품명]" /v "[버전]" /c "[코멘트]"




'저장소 > 잡다한거' 카테고리의 다른 글

TortoiseSVN Commands  (0) 2013.03.19
Stack Overflow 사례  (0) 2013.02.20
국가 코드(Country Codes), 대륙 코드(Continent Codes), 언어 코드  (0) 2013.01.09
Syntax Highlighter 적용 방법  (0) 2012.11.09
ASCII Table  (0) 2012.10.17