기본 콘텐츠로 건너뛰기

[QT] 단순한 프로젝트 생성하기

 리눅스 환경에서 개발할 때는 결과물을 만들기 위해 위젯으로 GUI를 디자인하고 각 컨트롤들의 동작을 구현했으며 Core 기능을 구현하여 커멘드에서 빌드를 수행하였다. 즉 개발과 빌드 환경이 분리되어 윈도우 IDE와 생산성 비교시 떨어지는 단점이 있었는데 윈도우 환경과 버전 5에서는 어떻게 운영하게 되는지 확인하고자 한다.  윈도우 10에서 설치된 Qt Creator를 이용하여 버튼을 클릭하면 다이얼로그 창을 닫는 간단한 프로젝트를 만들어 본다. * 프로젝트 생성할때 소스와 헤더, 리소스, UI를 폴더로 구분한다. 이때 path는 .pro에서 includlepath를 걸어준다. * 실행할 때 qt 기본 dll이 없는 경우 qt 관련 dll들을 실행파일이 있는 폴더에 복사하고, 위와 같은 에러 메시지는 "platforms" 라는 폴더를 만들어서 "qwindows.dll"를 복사하여 해결하였음. 이것들은 일단 벤치마킹하는 프로젝트에서 가져왔다. * 

[QT] 5.15.2 버전 다운로드와 설치하기

1. 버전 5.15.2를 설치하기 위해 QT 다운로드 사이트 에 접속하였으나 실행파일이 존재하지 않는다. 가장 최신의 실행파일은 ver5.14.2 이므로 일단 이것을 다운받아서 설치한다. ( 참고 사이트 - https://sloth-code.tistory.com/6#comment16833678 ) 다운 사이트  - https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.14/5.14.2/  ------------- 버전이 맞지 않으니 재 설치한다. 2.  5.15.2 버전에는 실행파일 exe가 없고 zip과 tar.gz 파일만 존재한다. ( https://bio.nic.funet.fi/pub/mirrors/download.qt-project.org/archive/qt/5.15/5.15.2/ ) OFFLINE_README.txt를 읽어보면 5.15 버전부터는 오픈 소스 오프라인 설치를 이용할 수 없다고 한다. 오프라인 설치를 원할 경우 다음 사이트 참조하라고 한다.  ( 원본:  The Qt Company offering changes, open source offline installers are not available any more since Qt 5.15. Read more about offering changes in the https://www.qt.io/blog/qt-offering-changes-2020 blog. If you need offline installers, please consider our new Qt for Small Business offering: https://www.qt.io/blog/available-now-qt-for-small-businesses ) - https://www.qt.io/blog/available-now-qt-for-small-businesses ...

[번역] Linux Device Drivers, 2nd Edition ( chap13 )

13장 mmap and DMA ( by Alessandro Rubini & Jonathan Corbet ) ----------------------------------------------------------------------------------------------- * 2005년에 개정 3판이 나왔지만, 보유하고 있는 2판으로 작업. 몇 년만에 다시 접하는 리눅스 디바이스 드라이버에 대하여 학습을 목표로 번역을 시작한다. 11월 목표. -----------------------------------------------------------------------------------------------  이번장은 디바이스 드라이버 쓰기 기술이 중요한 리눅스 메모리 관리 영역을 연구한다. 이번 장의 소재는 무엇보다 향상된 것이고 누구나 이해할 만한 것은 아니다. 그럼에도 불구하고, 많은 작업들이 메모리 관리 서브시스템내에 깊이 이해되어야 할수 있는 것들이다; 이것은 어떻게 커널 동작의 중요한 영역이 되는지 흥미로운 관점을 제공하기도 한다. 이번장의 소재는 세가지 세션으로 나눠진다. 첫번째는 mmap 시스템 콜의 구현에 대한 것이다. mmap 시스템 콜은 디바이스 메모리 맵을 직접 사용자 프로세스의 주소 공간에  허용하게 한다. 우리는 그때 커널 kiobuf 메커니즘을 포함한다. 이것은 커널 공간으로부터 사용자 메모리에 직접 접근을 제공한다. kiobuf 시스템은 디바이스의 어떤 종류를 위해 "raw I/O"를 구현하기 위해 사용되기도 한다. 마지막 세션은 다이렉트 메모리 접근(DMA) I/O 동작에 대한 것이다. 이것은 주변 소자들이 시스템 메모리에 직접 접근하도록 도와준다. 물론, 이 기술들이 모두 리눅스 메모리 동작에 대한 이해를 요구한다. 따라서 리눅스 메모리의 서브 시스템의 개요에 대한 설명으로 시작한다.  Memory Management in Linux  이 세션에서는 운영 시스템에서 메모리 관리에...

[C/C++] 함수 호출 규약 ( Calling Conventions)

본 페이지에서는 함수 호출 규약에 대하여 정리하고자 한다.  먼저 윈도우 프로그램의 정석 마이크로 소프트 문서 페이지의 개요를 이해하기 위해 번역하고, 좀더 구체적인 개념에 대해 정리한다. 마이크로 소프트 문서 번역 출처  -  https://docs.microsoft.com/en-us/cpp/cpp/calling-conventions?view=vs-2019 Calling Conventions Visual C/C++ 컴파일러는 내부와 외부 함수을 호출하기 위한 여러가지 다른 규약을 제공한다. 이 차이점을 이해하는 것은 구독자의 프로그램을 디버깅 할 수 있도록 도와주거나 어셈블리 언어 루틴을 포함하는 구독자의 코드를 링크할 수 있도록 도와준다. 이 주제에서 토픽들은 함수 호출 규약의 차이점을 설명한다, 아규먼트들이 어떻게 입력되고 반환값들은 함수에 의해 어떻게 반환되는지 등에 대한 것들. 토픽은 구독자가 자신의 프롤로그 코드와 에필로그 코드를 작성할 수 있게 하는 좀더 향상된 특성인 naked 함수 호출에 대해 설명한다. x64 프로세서를 위한 함수 호출 규약에 대한 정보는 여기 를 참조하라. # 이 세션의 토픽들 1) 아규먼트 입력과 네이밍 규약  ( __cdecl, __stdcall, __fastcall, and others ) 2) 함수 호출 예제: Function  Prototype and Call 3) 커스터머 프롤로그/에필로그 코드를 호출하는 naked 함수 사용하기 4) 플로팅 포인트 코플세서와 함수 호출 규약 5) 예전 함수 호출 규약 아규먼트 입력과 네이밍 규약 MS C++ 컴파일러는 구독자가 함수와 호출자 간의 아규먼트 입력과 반환값을 위한 규약을 정하도록 한다.  - 생략( -  구독자는 ESI, EDI, EBX 레지스터에 저장하고 복구하기 위한 프롤로그와 에필로그 코드를 생성한다.  구독자 함수의 프롤로크와 에필로그 코드를 정의하는 방법은 Naked Function Cal...

C# dll 파일들을 지정 폴더에서 사용하기

C#으로 여러 프로세스를 생성할 때, 각각의 프로젝트에서 사용하는 dll을 공동으로 사용하게 된다. 이때 dll은 실행 파일과 같은 폴더내에 존재해야 실행할 수 있다. 같은 dll을 사용하고 관리하는 관점에서 복사하는 일은 효율성이 떨어지며 항상 버전에 신경을 써야 하는 불편함이 있다. 이와 같은 비효율성을 제거하고자 실행파일과 다른 폴더에 있는 dll에 접근하는 방법으로 다음과 같은 방법을 사용하고자 한다. 코드를 수정하지 않고 지정할 수 있는 방법이 가장 편리하고 단순하겠지만 이와 같은 방법은 서브 폴더를 이용하는 방법밖에는 없다. dll이 필요할 때 발생되는 이벤트 핸들러를 추가하고 이를 등록하여 지정된 폴더를 사용할 수 있도록 코드를 추가하여 해결한다. 참고 사이트:  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNo=8&no=169705&ref=169702 * dll 필요할 때 발생되는 이벤트 핸들러 추가 static   System.Reflection.Assembly RsveAssem( object   sender, ResolveEventArgs args) {      System.Reflection.Assembly thisAss = System.Reflection.Assembly.GetExecutingAssembly();      var name = args.Name.Substring(0, args.Name.IndexOf( ',' )) +  ".dll" ;             if ( name ==  "abc.dll"   )      {    ...