GitHub: https://github.com/Microsoft/vcpkg  

demo 영상: https://www.youtube.com/watch?v=y41WFKbQFTw

 

Visual C++에서 OSS의 라이브러리를 사용하기 위한 패키지 매니저.

 

인스톨 순서는 다음과 같다.

1. https://github.com/Microsoft/vcpkg.git 을 복제.

2. 복제한 디렉토리에서 powershell-exec bypass scripts\bootstrap.ps1 를 실행하여 빌드 한다.

3.  .\vcpkg integrate install 로 사용자 전체에 설치(첫 회는 관리자 권한 필요).

4. 패키지 설치는 아래처럼 한다
..\vcpkg install sdl2 curl

 

 

 

작업 예와 대응 패키지에 대해서:

https://github.com/Microsoft/vcpkg/blob/master/docs/EXAMPLES.md

 

MIT 라이선스.

 

 

출처: https://opcdiary.net/?p=32935

저작자 표시
신고
by 흥배 2016.09.30 08:00

회사에서 빌드 머신을 만들 때 개발 중인 프로그램을 빌드를 하기 위해 하는 것에 비해 덩치가 큰 비주얼스튜디오를 설치해야 한다.

코딩을 한다면 비주얼스튜디오를 설치하는 것은 괜찮지만 그냥 문제 없는 코드를 빌드만 하는데 덩치 큰 비주얼스튜디오를 설치해야 하고, 이것 때문에 비주얼스튜디오 라이선스를 하나 소비해야 한다.

 

이런 문제를 해결하기 위해서 얼마 전에 VC 프로젝트를 빌드만 할 수 있는 툴을 MS에서 제공했다.

 

특징은 다음과 같다.

Visual C++ Compilers (targeting x86, X64 and ARM)

Visual C++ headers & libraries (CRT & STL)

Visual C++ build scripts (targeting Windows desktop)

Microsoft Build Tools 2015 (MSBuild)

Windows SDK 8.1 (optional, on by default)

Windows SDK 10 (optional, off by default)

ATL and MFC (optional, off by default)

C++ Build tools specific command prompts

 

더 자세한 설명은 VC 블로그를 보기 바란다

https://blogs.msdn.microsoft.com/vcblog/2016/03/31/announcing-the-official-release-of-the-visual-c-build-tools-2015/

 

다운로드는 http://go.microsoft.com/fwlink/?LinkId=691126

 

저작자 표시
신고
by 흥배 2016.05.02 08:00
C++, vc, vc++

- 헤더 의존을 줄인다. 자주 변할 수 있는 코드는 헤더에 쓰지 않는다.

 

- 모듈화 하여 의존을 줄이거나 모듈을 dll화 하여 링크 시간을 단축하다(단 너무 나누는 것은 주의).

모듈별로 프로젝트를 분할하면 자연스럽게 의존이 없어지고 그 결과 프로그램 변경 시 빌드 시간 단축도 생긴다.

또 정적 링크(staticLib)에서 동적 링크(dll)로 바꾸는 것으로 링크 시간이 줄어진다.

 

- 프리 컴파일 된 헤더 / 병렬 빌드를 적절히 설정한다.

 

- PC 성능 업그레이드

CPU 성능을 올린다.

메모리를 늘린다. 빌드 시 HDD 스왑이 줄면서 빌드(링크도?) 속도가 개선된다.

HDD → SSD로 바꾼다.

 

- 소스 코드가 너무 크고 복잡하다

프리 프로세스에 시간이 걸리거나 소스 코드가 복잡하면 빌드 시간에 영향을 주고, 빌드 후의 OBJ 파일 사이즈가 너무 크면 링크에 영향을 미친다.

 

- 복잡한 템플릿

STL 이나 boost를 사용한 것만으로 빌드 시간이 늘어났다고 느낀 경험이 있을 것이다.

프리 프로세스에서 행해지는 템플릿 해석은 빌드 시간에서 템플릿의 전개에 의한 코드 사이즈의 증가로 링크 시간에 지대한 영향을 끼치므로 템플릿은 용법 용량을 지키고 올바르게 사용해야 한다.

 

- 대량의 강제 inline

강제 inline도 비교적 위험. 처리 속도를 높이는 것만이 최적화라고 믿는 사람이 상당수 존재하므로 모든 함수를 강제 inline화 했는데 알고 보니 OBJ 사이즈가 커져서, 빌드 시간이나 링크 시간에 영향을 미쳤다. 최대한 inline화는 우리보다 몇 배 똑똑한 컴파일러에게 맡기도록 한다.

 

- 엄청나게 큰 static 영역이 잔뜩(그렇게 영향 없을지도?)

소스에 엄청나게 큰 static한 배열이 있으면 OBJ의 사이즈가 크게 된다. 강제 inline이나, 과격 한 templete 사용이 없는데도 왠지 링크 시간이 너무 많이 걸리는 경우는 static이 원인 일수도 있다.

 

 

 

출처: http://qiita.com/DandyMania/items/2c44481f03f4d08a24ea

 

저작자 표시
신고
by 흥배 2015.12.09 08:00
C++, vc, vc++

VC++을 사용할 때 링크 오류가 발생하여 시간을 허비하는 경우가 있다.

보통 아래의 이유로 링크 오류가 발생하는 경우가 많다.

 

- 문자 코드의 취급이 같지 않다.

Use Unicode Character Set, Use Multi-Byte Character Set

 

- [C/C++][Code generation][Runtime Library]의 취급이 같지 않다.

Release 모드| Debug 모드

정적 링크를 사용할 경우 Multi-threaded(/MT) | Multi-threaded Debug(/MTd)

DLL을 사용할 경우 Multi-threaded DLL(/MD) | Multi-threaded Debug DLL(/MDd)

 

- 링크 라이브러리의 디렉토리를 지정하지 않았다.

[VC++ Directories][library Directories]

 

- 링크하는 설정 lib 파일이 아직 준비되지 않았다.

Debug 모드 or Release 모드

문자 코드

MultiThread 취급

32bit Or 64bit

 

- 복사한 설정에서 잘못된 의존성·설정이 된 경우

 

- 설정에 다른 버전의 컴파일러가 사용 되었을 때

 

 

 

출처: http://qiita.com/nonbiri15/items/e8cffa47596f49023480

저작자 표시
신고
by 흥배 2015.11.27 08:00

* VS 2015 update11130일에 나올 예정인데 이 버전에서는 고쳐질 수도 있다.

 

Visual C++2012, 2013, 2015 std::this_thread::sleep_for 함수는 내부에서  std::this_thread::sleep_until 함수를 호출하고 있다.

구체적으로 말하면 sleep_for 인수에 전달된 시간 값을 현재 시간에 더해서 절대 시간으로 변환하고, 그것을 sleep_until 함수의 인수로 전달하고 있다.

 

이 구현 방법에는 문제가 있다. sleep_for 함수 처리 도중에 다른 스레드와 다른 프로세스에 의해서 시간이 변경되면(OS의 시간을 변경하면) 정상적으로 동작하지 않는다.

예를 들어 현재 PC 시간이 10 0 0초이고, sleep_for 함수의 인수에 1초를 전달하고 이 처리 도중에 사용자가 PC 시간을 9 0 0초로 변경했다면 다음과 같이 동작한다.

 

1. sleep_for 함수 내에서 현재의 PC 시간 10 0 0초와 인수 값 1초를 더하여 절대 시간 10 0 1초를 만든다.

2. 여기에서 유저가 PC 시간을 9 0 0초로 변경.

3. sleep_until 함수에는 10 0 1초를 준다.

4. PC 시간이 10 0 1초때까지 1시간 0 1초간 sleep 하게 된다.

 

 

gcc에서 사용하는 libstdc++, clang/LLVM에서 사용하는 libc++에서 sleep_for 함수는 인수의 시간 값을 시각으로 변환하지 않고 그대로 시스템의 sleep 함수에 전달하고 있어서 VC++과 같은 문제는 일어나지 않는다.

sleep_until 함수를 직접 호출한 경우는 동등한 문제가 생길 수 있지만 이 함수는 원래 특정 시간까지 대기하기 위한 함수이므로 용도 외에 사용하지 않는 한은 단순히 쓴 대로 움직인다.

 

 

출처: http://www.ruche-home.net/boyaki/2015-11-11/VCsleep_

 

저작자 표시
신고
by 흥배 2015.11.23 08:00

VC++ 14 에서는 이전과 다르게 유니버셜 CRT를 사용한다.

그래서 VC++ 14 이 설치되지 않은 곳에 VC++ 14로 만든 데스크탑 애플리케이션(정적 링크를 사용하지 않은)을 배포할 때 는 아래의 dll 이 배포할 애플리케이션과 같은 폴더에 있어야 한다.

 

1. uCRTDLL

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger 혹은

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger 에 있는 x64 혹은 x86dll

 

만약 디버그 버전으로 만든 애플리케이션이라면 ucrtbase.dll 대신에 ucrtbased.dll 이 필요.

ucrtbased.dll 파일은 System32 SysWOW64 폴더에 있다.

 

 

2. VC++ 14용 런타임

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist

폴더에서 배포할 애플리케이션에 필요한 dll

필요한 dll Dependency Walker로 찾으면 된다.

 

 


참고: http://dev.activebasic.com/egtra/2015/08/31/832/

 

저작자 표시
신고
by 흥배 2015.09.21 08:00

실행 프로그램에서 공용 dll을 사용하는 경우 아래와 같은 에러가 발생할 때가 있다.

 

File: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c

Line: 1424

 

Expression: _pFirstBlock == pHead

 

위 에러가 발생했을 때 내가 만든 코드에 문제가 없고 프로젝트 설정에도 문제가 없다면 십중팔구 공용 dll 버전과 내 프로그램의 버전이 달라서 발생한 것이다.

 

여기서 버전이 다르다는 것은 dll exe 프로그램을 만든 Visual Studio 버전이 다르다는 것으로 dll VS 2012로 빌드하고 이것을 VS 2013으로 만드는 프로그램에서 사용하면 프로그램 실행 중에 공용 dll을 호출할 때 발생할 수 있다.

저작자 표시
신고
by 흥배 2014.11.03 08:00

출처: http://www.naturalsoftware.jp/blog/4271 http://www.naturalsoftware.jp/blog/4611

번역: 최흥배

 

Visual Studio 2012에서는 아래의 3개의 유닛테스트 프로젝트가 추가되었다.

  • C++/CLI(.NET) 유닛테스트 프로젝트
  • C++/CX(Windows 스토어 ) 유닛테스트 프로젝트
  • C++(Native) 유닛테스트 프로젝트


여기서는 C++ 유닛테스트를 소개한다.

1. 테스트 대상 프로젝트를 만든다. 여기서는「Win32 콘솔 애플리케이션」으로「NativeLibrary」라는 프로젝트 이름으로 한다.

2. 애플리케이션 종류를 '스테틱 라이브러리' 하고 완료 한다.

 

3. 다음으로 같은 솔류션에 '기본 유닛테스트 프로젝트' 만든다.

4. 솔루션에 테스트 대상 라이브러리 NativeLibrary」와 테스트 프로젝트 NativeLibraryTest2개가 만들어졌다.

 

5. 상태에서 한번 빌드 해본다. 테스트 탐색기에 ' 실행 테스트' 추가되었다. 테스트 탐색기가 표시되지 않은 경우는 메뉴의 '테스트 | 윈도우 | 테스트 탐색기' 표시한다.

6. 이번에는 '테스트 탐색기' 왼쪽 위에 있는 버튼을 눌러서 '리빌드' 해본다. 빌드 종료와 같이 테스트가 실행된다.

7. 테스트 이름을 바꾸어본다. 테스트 이름은 한국어를 사용해본다. 빌드하면 테스트 탐색기쪽에 메소드 이름이 바뀐다.

8. 실제 테스트 대상으로 하는 클래스를 만들어본다. NativeLibrary 프로젝트의 '추가' 클래스를 추가한다.

 

9. Calc 이라는 이름을 붙인 클래스를 만든다.

 

10. 더하기 계산 멤버 함수를 만든다. 먼저 구현은 하지 않는다.

 

11. NativeLibraryTest 프로젝트 속성을 열고, C++ 「추가 포함 디렉토리」에 $(SolutionDir」을 추가한다.

12. 계속해서 「공통 속석」의 「새로운 참조 추가」를 누른다.

 

13. 테스트 대상 NativeLibrary 프로젝트가 표시 되므로 체크를 넣어서 OK」를 누른다.

14. 참조에 NativeLibrary」가 추가된 것을 확인한다.

 

15. 이것으로 테스트 준비가 끝났으므로 NativeLibraryTest 프로젝트에 테스트 코드를 쓴다. 테스트 대상을 구현하지 않았으므로 테스트는 실패한다.

16. 테스트 대상을 구현한다. 테스트는 성공.

 

이것으로 네이티브 C++ 에서 단위 테스트는 끝이다. C# 같이 메소드나 클래스의 동적 생성, 리팩토링과 같은 기능은 없으므로 조금 시간이 걸린다.

 

 

 

 

 

 

 

 

Visual Studio 2012 네이티브 C++ 유닛테스트에서 아래와 비슷한 클래스간의 테스트를 만든 경우 Asert::AreEqual 에서 다음과 같은 에러가 나온다.

에러 1 error C2676: 이항연산자 '==' : 'const Person' 、이 연산자 또는 정의된 연산자에 적절한 형으로의 변환을 정의하지 않았다.

이것은 Asert::AreEqual == 연산자를 사용하고 있지 않기 때문으로 Person == 연산자를 구현한다.

그러면 이번에는 다른 에러가 나온다.

에러 1 error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class Person>(const class Person &).

모르므로 에러를 더블클릭 해보면 다음의 파일로 이동한다.

에러를 출력하기 위한 함수 템플릿 ToString」이 필요해서 기본적인 형에 대해서는 특별화 되어 있지만 유저 정의현 클래스 등은 특별화 되어 있지 않으므로 static_assert 호출되어 ToString」가 호출되고 있는 같다.

이런 이유로 ToString」을 구현하면 좋을 같다. ToString」는 이름 공간「namespace Microsoft{ namespace VisualStudio {namespace CppUnitTestFramework {」에 구현되어 있으므로 이것에 맞춘다. (Person std::string std::wstring 변환하였다).

 

이것으로 테스트를 실행할 있고 Assert 실패한 경우네는 에러 내용이 표시되도록 되었다.

 

신고
by 흥배 2014.09.15 08:00
샘플 프로젝트 중 'Sample02_ImageViewer'



#include <Windows.h>

#include <balor/graphics/all.hpp>

#include <balor/gui/all.hpp>


using namespace balor::graphics;

using namespace balor::gui;



int APIENTRY WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) 

{

Frame frame(L"ImageViewer");

Bitmap bitmap;


typedef Menu::ItemInfo Item;

Item fileMenuItems[] = {

Item(L"열기(&O)\tCtrl+O", Key::Modifier::ctrl | Key::o),

Item(),

Item(L"종료(&X)\tAlt+F4", Key::Modifier::alt | Key::f4)

};

Item menuBarItems[] = {

Item(L"파일(&F)", fileMenuItems),

Item(L"도움말(&H)", [&] (Menu::Click& ) { MsgBox::show(L"Image Viewer Ver 1.0", L"버전 정보"); })

};

MenuBar menuBar(menuBarItems);

frame.menuBar(&menuBar);


frame.onShortcutKey() = [&] (Frame::ShortcutKey& e) {

switch (e.shortcut()) {

case Key::Modifier::ctrl | Key::o : {

OpenFileDialog dialog;

dialog.filter(L"그림 파일\n*.bmp;*.gif;*.png;*.jpg;*.jpeg;*.tiff\n\n");

if (dialog.show(frame)) {

bitmap = Bitmap(dialog.filePath());

if (bitmap != nullptr) {

frame.scrollMinSize(bitmap.size()); // 윈도우 사이즈가 그림 사이즈보다 작으면 스크롤 할 수 있도록 한다

frame.invalidate();

}

}

e.handled(true);

} break;

case Key::Modifier::alt | Key::f4 : {

frame.close();

e.handled(true);

} break;

}

};

frame.onPaint() = [&] (Frame::Paint& e) {

e.graphics().clear();

if (bitmap != nullptr) {

Graphics bitmapGraphics(bitmap);

e.graphics().copy(frame.scrollPosition(), bitmapGraphics); // 스크롤을 빼고 이미지를 복사한다.

}

};


frame.runMessageLoop();

return 0;

}




저작자 표시
신고
by 흥배 2014.09.01 08:00

MS Build 컨퍼런스에서 Visual C++의 C++ 11 구현에 대한 이야기가 있었다.

작년에 나왔던 VC++ Nov 2013 CTP 다음 버전이 2~3개월 이내에 나올 예정이고 대부분의 C++11을 구현할 예정이라고 한다.

더해서 C++14 기능 중 일부도 구현될 예정이라고 한다.



좀 더 자세한 내용은 http://channel9.msdn.com/Events/Build/2014/2-661 를 보기 바란다.


저작자 표시
신고
by 흥배 2014.04.07 08:00
| 1 2 3 4 ··· 6 |

티스토리 툴바