"파일경로" 파일을 "xxx.exe"(으)로 복사할 수 없습니다. 'xxx.exe' 파일은 다른 프로세스에서 사용 중이므로 프로세스에서 액세스할 수 없습니다. 


VS 버그인듯...


빌드전 이벤트에 추가


if exist "$(TargetPath).locked" del "$(TargetPath).locked"

if exist "$(TargetPath)" if not exist "$(TargetPath).locked" move "$(TargetPath)" "$(TargetPath).locked"

if exist "$(TargetDir)$(TargetName).pdb.locked" del "$(TargetDir)$(TargetName).pdb.locked"

if exist "$(TargetDir)$(TargetName).pdb" if not exist "$(TargetDir)$(TargetName).pdb.locked" move "$(TargetDir)$(TargetName).pdb" "$(TargetDir)$(TargetName).pdb.locked"

블로그 이미지

란마12

,

 Visual Studio 2010 을 사용중 /MP 스위치를 사용 할 수 있다는것을 깜박하고 있다가 진행 중인 프로젝트에 적용을 시켜 보았다.

 

프로젝트 옵션 -> C/C++ -> 일반 -> 다중 프로세서 컴파일에 예(/MP ) 옵션을 켜고 컴파일 시작.

 

Gm 스위치와 호환이 안되므로 MP 를 무시한다고 나옴..

 

프로젝트 옵션 -> C/C++ -> 코드 생성 -> 최소 다시 빌드 가능 항목의 /Gm 옵션을 아니오 (/Gm-) 로 바꿔준 다음

 

다시 컴파일을 진행...

 

error C2813: /MP를 지정하면 #import를 사용할 수 없습니다.

 

으엌.. ㅠㅠ

 

프로젝트에서 사용중인 ADO dll 을 import 해서 사용중인데 MP 스위치와 import 옵션을 동시에 사용 할 수 없다고 MSDN 에서도 명확하게 말하고 있음..

 

그래도 난 쓰고 싶은데.. 그래서 찾아 봄.

 

#import 구문을 통해 사용하는 dll 은 COM 으로 이루어진 dll 이기 때문에 tlh 같은 Type Library Header 가 분명 생성이 됨

 

다음과 같은 과정을 거치면 import 구문을 빼고 include 구문으로 변경해서 MP 스위치를 사용 할 수 있다.

 

1. tlh 파일 추출하기

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF""adoEOF") rename("BOF""adoBOF")

 

구문을 그대로 두고 컴파일을 진행 한다.

 

컴파일이 성공하면 Object 파일들이 생성 되는 Debug 폴더 또는 Release 폴더로 가보자.

 

#import 처리기가 하는 역할이 dll 에서 tlh 를 추출하여 헤더 파일에 그대로 붙여 넣는 작업을 해주는 역할이기 때문에 Debug 폴더나 Release 폴더에 가보면 다음과 같은 파일이 보일것이다.

 

msado15.tlh

msado15.tli

 

각각 용량은 167KB, 146KB 정도로 꽤 큰편이다.

 

위 두파일을 복사해서 #import 구문을 사용했던 소스와 동일한 경로에 붙여넣기 한다.

 

#import ".........

코드를 다음과 같이 변경한다.

#include "msado15.tlh"

 

이렇게 하면 #import 로 추출된 tlh 파일을 include 하는 구조이기 때문에 동일한 역할을 수행한다.

 

/MP 스위치를 켜고 빌드 -> 솔루션 다시 빌드 를 선택하여 컴파일을 진행해 보면 또 컴파일 실패가 된다.

 

msado15.tlh(5025): fatal error C1083: 포함 파일을 열 수 없습니다. "....\msado15.tli': No such file or directory"

 

하지만 컴파일 오류 내용을 잘 보면 포함 파일을 열 수 없습니다. 라고 나오는것을 알 수 있기 때문에 tlh 파일 안에서 msado15.tli 파일을 찾을 수 없다 라는 오류를 알 수 있다.

 

msado15.tlh 파일을 메모장등의 에디터로 열어보자.

 

편집 -> 찾기 메뉴를 이용하요 .tli 를 찾아 보면 거의 끝부분에서 다음 줄을 찾을 수 있다.

 

//
// Wrapper method implementations
//

#include ".......\debug\msado15.tli"

 

 

앞 경로는 개인정보 보호상 삭제..

 

Full Path 로 된 #include  문을 찾을 수 있는데 바로 이 부분의 경로가 Debug 폴더까지 들어가 있어서 파일을 찾을 수 없는것으로 나오는것이다.

 

경로를 #import 문이 있는 소스의 경로로 수정한 다음 다시 한번 컴파일 해보면

 

제대로 컴파일 되는것을 확인 할 수 있다.

 

진행중인 프로젝트의 소스는 약 9500 라인의 C++ 소스이며 /MP 적용을 하지 않고 컴파일 하면

 

1:21초 정도의 컴파일 진행시간이 소요 된다.

 

/MP 적용후에는 31초로 시간이 단축 되는것을 확인 할 수 있으며

 

즉, 다음과 같다.

 

 /MP 적용 전 -> 1분 21초

 /MP 적용 후 -> 31초            약 260% 컴파일 속도 증가

 

다음과 같이 CPU 도 Full 로 사용하는것을 볼 수 있다.

 

 

 

다들 /MP 옵션을 이용해서 컴파일 시간을 줄여 보아요~~!


http://blog.acidpop.kr/96

블로그 이미지

란마12

,

삽질 기록

tool/VS10 2013. 8. 19. 22:23

릴리즈 모드에서 다음과 같은 경고 발생 시 

/GL로 컴파일한 MSIL .netmodule 또는 모듈이 있습니다. /LTCG를 지정하여 링크를 다시 시작하십시오. /LTCG를 링크 명령줄에 추가하면 링커 성능이 향상됩니다.

프로젝트 속성 -> 구성 속성 -> 일반 -> 전체 프로그램 최적화: 링크 타임 코드 생성 사용 선택



라이브러리 디렉터리 설정방식이 두가지이다.

1. 구성속성 -> VC++ 디렉터리 -> 라이브러리 디렉터리

2. 링커 -> 일반 -> 추가 라이브러리 디렉터리(/LIBPATH)

솔루션안에 정적라이브러리 프로젝트와 EXE프로젝트가 같이 있을 때

EXE프로젝트들은 2번에 추가로 경로를 명시해주지 않으니 라이브러리 파일들을 찾지 못하는 현상이 발생



정적 라이브러리 쪽의 클래스: class __declspec(dllexport) A{...

응용프로그램 쪽의 클래스: class __declspec(dllimport) A{...

릴리즈모드에서 컴파일 시 error LNK2001: "__declspec(dllimport) public: __thiscall...  발생하여

두 프로젝트 모두 속성 -> 일반 -> 전체 프로그램 최적화: 전체 프로그램 최적화 안 함

으로 설정하니 오류 안남



프로젝트의 필터정보는 *.vcxproj.filters에 저장. 그냥  프로젝트파일(*.vcxproj)만 복사하면 필터정보가 누락되어 트리에서 헤더와 소스파일이 구분없이 통으로 나열됨.

디버그 설정 정보(실행인자 등)는 *.vcxproj.user에 저장. 이 파일은 SVN에서 관리되지 않음.


디버그 정보가 없는 것처럼 개체를 링크합니다. 경고 발생시

1. "구성 속성" -> "C/C++" -> "일반" -> "디버그 정보 형식" : "프로그램 데이터베이스(/Zi)"

2. "구성 속성" -> "C/C++" -> "코드 생성" -> "최소 다시 빌드 가능" : "아니요(/Gm-)"

3. "구성 속성" -> "C/C++" -> "명령줄" -> "추가 옵션"에 "/Ylsymbol"를 입력
4. "구성 속성" -> "C/C++" -> "일반" -> "전체 프로그램 최적화": "아니요"


블로그 이미지

란마12

,

Here is a simple way to make Visual Studio always launch as Administrator in Windows 8:

  1. Go to HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
  2. Add a String Valueand set its name to “C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe”. Set its value to “RUNASADMIN”.
  3. Do the same again but use “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe” as the name.
  4. Done! Now every time you start Visual Studio it runs as Administrator!

http://daniellang.net/always-run-visual-studio-as-administrator-in-windows-8/

블로그 이미지

란마12

,

stdafx.h 추가


프로젝트 속성 변경



stdafx.cpp 추가 후 #include "stdafx.h"

stdafx.cpp 속성 변경





'tool > VS10' 카테고리의 다른 글

삽질 기록  (0) 2013.08.19
윈도우8에서 항상 관리자 권한으로 실행  (0) 2013.03.15
fatal error C1083: 미리 컴파일된 헤더 파일을 열 수 없습니다.‎  (0) 2012.08.08
원격 디버깅  (0) 2012.07.10
c++ 단축키  (0) 2011.10.17
블로그 이미지

란마12

,

1. 프로젝트 속성 -> 미리 컴파일된 헤더: 사용(/Yu)

2. 미리 컴파일된 헤더로 지정된 파일이 StdAfx.h라면

   StdAfx.cpp 속성 -> 미리 컴파일된 헤더: 만들기(Yc)

'tool > VS10' 카테고리의 다른 글

윈도우8에서 항상 관리자 권한으로 실행  (0) 2013.03.15
'미리 컴파일된 헤더' 수동 등록  (0) 2012.12.06
원격 디버깅  (0) 2012.07.10
c++ 단축키  (0) 2011.10.17
Why does Visual Studio 2010 create ipch folder and .sdf file?  (0) 2011.05.05
블로그 이미지

란마12

,

원격 디버깅

tool/VS10 2012. 7. 10. 20:21

Visual Studio 2008을 설치했다면 C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\x86\에 가면 있을 것이다. 64bit x64 폴더에 있을 것이다실행파일은 msvsmon.exe이다.

 

프로그램을 실행할 PC(test pc)에 디버깅 모니터 툴을 설치한다없다면 위에 x86 폴더나

x64폴더를 컴퓨터 환경에 맞게 그대로 복사해도 된다.

 


 * 원격 디버깅 시작

 

프로그램 소스 중 멈출 곳 바로 위에 __debugbreak() 함수를 넣어준다.

  (__debugbreak() 함수는 브레이크 포인트를 걸은 것과 같은 효과를 지닌다.)

   컴파일하고 실행할 준비를 한다.




Visual Sutdio 원격 디버깅 모니터를 실행한다.

Visual Studio 원격 디버깅 모니터 툴 >> 도구 >> 옵션에 가자.

인증 안 함(네이티브 전용)을 선택

모든 사용자가 디버깅할 수 있도록 허용에 체크

최대 유휴 시간() 0으로 설정한다.

 


[참고] Windows XP SP2 이상에서는 원격 디버깅 모니터를 실행할 경우 '네트워크 액세스: 로컬 계정에 대한 공유 및 보안' 로컬 보안 정책 옵션이 '게스트 전용 - 로컬 사용자를 게스트로 인증'으로 설정되어 있으므로 Visual Studio 원격 디버깅 모니터에서 응용 프로그램을 디버깅할 수 없습니다. 이것은 로컬 보안 설정' 관리도구에서 구성할 수 있습니다.' 라는 경고가 뜬다.

이를 풀기 위해서는 '제어판-관리도구-로컬보안정책'을 실행한 후, '로컬정책-보안옵션' 항목 중 '네트워크 액세스: 로컬 계정에 대한 공유 및 보안' 항목의 값을 '일반 - 로컬 사용자를 그대로 인증'으로 바꿔주면 된다.





  



이제 프로그램을 실행하면 위와 같이 오류 관련 경고 윈도우가 뜬다.

 

디버깅할 PC에 Visual Studio 2008(이하 VS2008라 칭함)로 가자

 



도구 >> 프로세스에 연결에 들어가자.

전송에 원격(네이티브 전용인증 안 함)으로 설정한다.

정자에 디버깅하려고 하는 PC IP를 적는다.

이제 사용 가능한 프로세스에 디버깅 할 프로세스를 선택하고 연결을 누른다.

그리고 나서 아까 오류 관련 윈도우 경고 창이 뜬 곳에서 보내지 않음을 누른다.

 




중단을 누르고 재미난 디버깅의 세계에 빠져들어 보자.

 

 

실행되는 PC에 운영체제가 Vista인 경우

 

Vista에서 오류 보고 윈도우가 안 뜰 수도 있고뜨더라도 프로그램이 종료되는 상황이 발생할 것이다예를 들어서 DLL이나 Service 프로그램을 디버깅할 때 말이다하지만 걱정하지 마시길~ Vistavsjitdebugger.exe 을 시스템 폴더(system32)에 설치하고 그 뒤에 vsjit.reg 파일을 레지스트리에 등록하면 된다그러면 아래와 같은 오류 보고 창에

  프로그램 디버그 항목이 하나 더 뜨는데 그것을 누르면 된다.



 
 VS2008
에서 도구 >> 프로세스에 연결이 안될 수 있는데 그럴 때는 Visual Studio 원격 디버깅 모니터 툴을 관리자 권한으로 실행해야 한다그리고 해당 PC에 네트워크 연결이 안될 경우에는 방화벽 옵션을 해제하면 된다.

  

* Tip

 

 -  __debugbreak() 함수 대신에 getchar(), Sleep() 등을 사용해서 VS2008에서 attach를 할 수 있도록 해 주면 간편하게 원격 디버깅을 할 수 있다.


출처: http://blog.daum.net/jangbi/16474779

블로그 이미지

란마12

,

c++ 단축키

tool/VS10 2011. 10. 17. 17:36



블로그 이미지

란마12

,

You’ll find a folder named ipch and a large file with file extension .sdf if you use Visual Studio 2010. They exist for precompiled header files and intellisense. You don’t like it, but you’d still like to use intellisense and precompiled header. Visual Studio 2010 let you change the location of these temporary files. Open you Visual Studio 2010, and left click “Tools > Options”, choose “Text Editor > C/C++ > Advanced”, scroll down until “Fallback Location” appears. Make “Always use Fallback Location” and “Do Not Warn if Fallback Location” to be “True”, and choose a “Fallback Location” you like. Just like the below.

VisualStudio2010-FallbackLocation

Close Visual Studio 2010, and delete ipch and .sdf file, open VS. Now the folder and the file will be created at the location you specified.

http://wronso.com/blog/553/why-does-visual-studio-2010-create-ipch-folder-and-sdf-file.html

블로그 이미지

란마12

,