반응형
MinGW 사용
MinGW 설치
[install.exe 설치 파일 링크]
x_86_64로 변경.
오류 참고
설치 중 오류 발생함.
오류 메세지 : The file has been downloaded incrrectly!
해결법
zip파일을 다운로드 받아 C 드라이브에 직접 넣어줘야함
MinGW zip 파일 download link : https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
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
반응형