이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Tool 사용법/MinGW

MinGW 사용

이쿠우우 2022. 1. 20. 16:18
반응형

 

 
 

MinGW 사용 

 
 

 
 

MinGW 설치

 
[install.exe 설치 파일 링크] 

x_86_64로 변경.

 

오류 참고

설치 중 오류 발생함.
오류 메세지 : The file has been downloaded incrrectly!

 

해결법

zip파일을 다운로드 받아 C 드라이브에 직접 넣어줘야함

download 후 압축 출고 
mingw64\bin 
경로를 환경변수 PATH에 추가해주면 완료.
 
 

설치 확인

[명령어]
gcc --version

 

test에 사용한 version : 8.1.0
version이 정상적으로 표시되면 MinGW 설치 완료.
 
 

 
 
 

MinGW GCC 빌드 test

 
VSCode 실행 후
Directory에 test.c 파일 생성
 
[예제 코드]
#include <stdio.h>

int main(){
    printf("test\n");
}
 
 

VSCode extension 설치

C/C++

 

빌드 test

VSCode에서 terminal 실행 후 gcc명령으로 빌드해보기
 
[명령어]
gcc -o test.exe .\test.c
 
[결과]
.\.test.exe 파일이 생성됨.
해당 파일 실행.

빌드 정상.
 
 

 
 
 

MinGW Make 빌드 test

 

test 코드 

 
.\Header\test.h
#include <stdio.h>

void test();
.\Src\test.cpp
#include "..\Header\test.h"

void test()
{
    printf("testtesttest\n");
}
.\Src\main.cpp
#include <stdio.h>
#include "..\Header\test.h"

int main()
{
    test();
}
 
 

Makefile 생성

 
.\Makefile
CC = gcc
CFLAGS = -c -g
LDFLAGS =  
OBJECTS = main.o test.o

run: all
    program

all: program

program : $(OBJECTS)
    $(CC)  $(LDFLAGS) -o program $(OBJECTS)

main.o : ./Src/main.cpp
    $(CC) $(CFLAGS) ./Src/main.cpp

test.o : ./Src/test.cpp
    $(CC) $(CFLAGS) ./Src/test.cpp
 

VSCode 환경구성

 
MinGW에서 Make 명령에 해당하는 바이너리 = mingw32-make.exe
VSCode에 MinGW make 빌드가 가능하도록 환경 구성해야함.

tasks.json 파일이 열리면 다음과 같이 편집.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "mingw32-make",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}
 
설정 완료 후 
Ctrl + Shift + B
단축키를 사용하면 Makefile을 통해 빌드가 진행됨.
 

결과

빌드 단축키 : Ctrl + Shift + B

정상 실행 후 obejct파일과 exe 파일이 생성.

 
 

 
 

MinGW CMake 빌드 test

 

CMake 설치

 
cmake-3.20.2-windows-x86_64.zip 
download 후 압축 출고 
cmake-3.20.2-windows-x86_64\bin
경로를 환경변수 PATH에 추가해주면 완료
 

CMake 설치 확인

cmd창에서 cmake 명령을 해보기.

 
VSCode CMake 빌드 설정.
 
위에서 Make 빌드 설명했던 과정에서 열었던
tasks.json 파일을 아래와 같이 편집.
{
    "version": "2.0.0",
    "runner": "terminal",
    "type": "shell",
    "echoCommand": true,
    "presentation" : { "reveal": "always" },
    "tasks": [
          //C++ 컴파일
          {
            "label": "compile for C++",
            "command": "cd $ && cmake . -G \"MinGW Makefiles\" && mingw32-make",
            "group": "build",


            //컴파일시 에러를 편집기에 반영
            "problemMatcher": {
                "fileLocation": [
                    "relative",
                    "$"
                ],
                "pattern": {
                    // The regular expression.
                   //Example to match: helloWorld.c:5:3: warning: implicit declaration of function 'prinft'
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        },
        // 바이너리 실행(Windows)
        {
            "label": "execute",
            "command": "cmd",
            "group": "test",
            "args": [
                "/C", "$\\$"
            ]
        }
    ]
}
 
VSCode 에서  Ctrl+Shift+P 단축키를 실행하고
C/C++을 입력하고
아래와 같이 Edit Configurations(UI)를 클릭.

창이 열면 컴파일러 경로를 MinGW의 G++로 변경.

 
 
 

CMakeLists.txt 생성

파일이름을 똑같이 생성.
# for "CMAKE_CXX_STANDARD" version
cmake_minimum_required(VERSION 3.1)
project(MinGW_test VERSION 1.0)
 
 
# set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Debug)
 
 
# for C++11 compiler
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 
# Add main.cpp example source code to the executable
add_executable(MingwTest ./Src/main.cpp ./Src/test.cpp)
 
add_executable(MingwTest ./Src/main.cpp ./Src/test.cpp)
이 부분만 있어도 정상 동작함.
맨 처음 MingwTest는 Build결과로 생성될 exe파일 이름임.
나머지는 그 실행파일을 생성하기 위한 source파일.
 
 

CMake 명령을 위한 배치파일 생성

 
build.bat
mkdir build
cd build

@REM Generate a Visual Studio solution for latest version found
cmake .. -G "MinGW Makefiles"
@if ERRORLEVEL 1 goto onError

@REM Build default configuration (ie 'Debug')
cmake --build .
@if ERRORLEVEL 1 goto onError

goto onSuccess

:onError
@echo An error occured!
:onSuccess
cd ..
cmake .. -G "MinGW Makefiles"
와 같이 cmake 명령어 -G 옵션을 주는데
MinGW의 Make 명령을 사용하기 위해서는
위와같은 옵션을 추가해야함.
linux환경에서는 해당 옵션이 필요없음.
 
 

CMake 를 사용해서 빌드.

상위에서 만든 배치파일을 실행

결과

bulid 폴더에 생성된 MingwTest.exe를 실행.

정상적으로 빌드되고 동작함.
 
 
 
 

 

Windows에서 spdlog API 사용해보기

spdlog 코드 가져오기 

[ZIP으로 download]
 
.\spdlog-1.x\include 폴더로 이동하면
spdlog 폴더가 있음.
해당 폴더를 복사.
 
프로젝트 external 폴더를 만들고
그 안에 붙여넣기.

 
 
spdlog는 header-only library 임으로
header만 include 해서 쉽게 컴파일할 수 있음.
 

spdlog test code

test.h
#include <stdio.h>

void test();
void spdlogTest();
 
 
test.cpp
#include "..\Header\test.h"
#include "..\external\spdlog\spdlog.h"

void test()
{
    printf("testtesttest\n");
}

void spdlogTest()
{
    spdlog::info("spdlog test in windows os");
}
 
main.cpp
#include <stdio.h>
#include "..\Header\test.h"

int main()
{
    test();
    spdlogTest();
}
 

CMakeLists.txt 파일

# for "CMAKE_CXX_STANDARD" version
cmake_minimum_required(VERSION 3.1)
project(MinGW_test VERSION 1.0)

# set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Debug)

# for C++11 compiler
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)


# include directories
include_directories(external)

# Add main.cpp example source code to the executable
add_executable(MingwTest ./Src/main.cpp ./Src/test.cpp)
 
 

빌드 시도 결과 오류 발생함.

 
[오류 메세지]
error: 'recursive_mutex' in namespace 'std' does not name a type
error: 'mutex' in namespace 'std' does not name a type
error: 'thread' in namespace 'std' does not name a type
error: 'condition_variable' in namespace 'std' does not name a type

[원인]
MinGW에서 C++11의 thread를 정식으로 지원하지 않는 문제점이 있음.
MinGW에서 Thread 관련 요소를 사용하려고 하면(특히 Mutex) 컴파일조차 되지 않고 에러가 발생함.
 
 
[해결법]
mingw-std-threads와 같은 라이브러리를 이용하는 방법이 있음.
Mutex, Thread 관련 Header file만 교체하는 라이브러리.
즉 header file을 찾아서 변경해줘야한는 작업이 필요함.
 
 
 
 

 
 

mingw-std-threads로 문제 해결해보기.

 

mingw-std-threads Code Download

 
mingw-std-threads github에서 코드를 zip으로 받고 압축 해제.
 
 

첫 번째 해결방법. (차마 못함.)

 
mingw-std-threads 프로젝트 압축을 해제해보면
Header 파일이 확인됨.
 
아래와 같이 Header file을 복사.

그리고 code에서 오류가 발생하고 있는 코드에서
#include <thread>
#include <mutex>
와 같은 코드를 전부
#include <mingw.thread>
#include <mingw.mutex>
로 교체하는 작업을 진행하면 됨....
 

두 번째 해결방법. (test완료.)

 
아마도 모든 include를 교체하는 작업은 무리가 있음....
수동으로 바꾸기는 하고싶지 않을것임....
mingw-std-threads github Page를 보면 아래와 같이 가이드를 하고 있어서
해당 작업을 진행해봄.
GCC 또는 clang을 사용하는 경우 수동으로 바꾸지 않아도 되는 몇 가지 방법이 있습니다.
CMake를 사용하면 다음과 같이 mingw-stdthreads를 추가하기 전에
MINGW_STDTHREADS_GENERATE_STDHEADERS 옵션을 켜면 됩니다.
 
option(MINGW_STDTHREADS_GENERATE_STDHEADERS "" ON)
add_subdirectory(mingw_stdthreads)
target_link_libraries(${TARGET} PRIVATE mingw_stdthreads)
 
CMake가 프로젝트 파일을 생성 할 때 "표준 헤더"방식으로
명명 된 헤더가 생성되어 포함 경로에 추가됩니다.
그런 다음 mingw.thread.h와 같은 것을 피하고
항상 #include <thread>를 계속 사용할 수 있습니다.
또한 MINGW_STDTHREADS_GENERATED_STDHEADERS가 정의됩니다.
이 매크로를 사용하여 생성 된 헤더가 실제로 사용 가능한지 확인할 수 있습니다.
해당 방법을 참고해서 진행 해봄.
 
[1. mingw-std-threads 폴더를 생성.]
해당 폴더에 압축 해제한 mingw-std-threads 파일을 전부 복사 붙여넣기함.

 
 
[2. CMakeLists.txt]
CMakeLists.txt 에 내용을 추가함.
빨간 부분이 추가한 내용.
 
예제 CMakeLists.txt
# for "CMAKE_CXX_STANDARD" version
cmake_minimum_required(VERSION 3.1)
project(MinGW_test VERSION 1.0)

# set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Debug)

# for C++11 compiler
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# include directories
include_directories(./external)

# Add main.cpp example source code to the executable
add_executable(MingwTest ./Src/main.cpp ./Src/test.cpp)

# MinGW in recursive_mutex, thread
option(MINGW_STDTHREADS_GENERATE_STDHEADERS "" ON)
add_subdirectory(mingw_stdthreads)
target_link_libraries(MingwTest PRIVATE mingw_stdthreads)
해당 3줄을 꼭 마지막에 추가해야 오류가 발생하지 않음.
add_subdirectory(mingw_stdthreads) 
상위에서 생성한 mingw-std-threads 폴더 이름을 넣어줌
 
target_link_libraries(MingwTest PRIVATE mingw_stdthreads) 
첫 번째 인자 :  상위에서 add_executable로 생성한 project이름을 넣어줌. (MingwTest)
두 번째 인자 : PRIVATE 입력
세 번째 인자 : 상위에서 생성한 mingw-std-threads 폴더 이름을 넣어줌
 
 
[3. 빌드 진행]
build.bat 파일 실행

[결과] 
성공.

[실행] 
Windows 에서 spdlog API 사용 가능

spdlog

 

반응형

'Tool 사용법 > MinGW' 카테고리의 다른 글

MinGW 리서치  (0) 2022.01.20