졸작 서버는 Windows<->Linux Cross Platform한 서버이다.
이 프로젝트를 원래는 Visual stdio 하나로 Linux 전용 프로젝트를 만들어서 관리하고, Windows 전용 프로젝트를 하나 더 만들어서 소스를 옮기는 방식으로 사용하고 있었다.
하지만, 이 방식은 너무 원시적이고 귀찮다고 생각해서 선배의 조언과 함께 찾은 방법은 CMake를 사용하는 것이었다.
아직 CMake에서 완벽하게 숙달이 되지는 않았지만 어느정도 쓸만하게는 쓸 수 있게 만들어서 간단히 기록해보려고 한다.
1. CMake 설치
윈도우는 그냥 CMake 사이트(https://cmake.org/download/)에서 받아서 설치하면 끝난다.
하지만 리눅스(필자는 Redhat계열 Centos 사용 중)에서 설치하는 방법은 이 링크(http://bitly.kr/QXjFcJ)를 따라했다.
윈도우의 경우 cmd->cmake, 리눅스의 경우 터미널에서 cmake를 쳐보면 잘 설치되었는지 확인할 수 있다!
2. CMake 작성
CMake는 해당 폴더의 CMakeList.txt 파일을 파싱 하여 작동한다.
그래서 CMakeList.txt를 다음과 같이 작성하였다.
cmake_minimum_required(VERSION 3.14)
PROJECT(JHNET)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
#Set GCC, G++ Setting
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_C_COMPILET "g++")
SET (SRCS
JHNETGameServer.cpp
JHNETGameServer.h
Content/PlayerManager.cpp
Content/PlayerManager.h
Content/RoomManager.cpp
Content/RoomManager.h
DataType/GameState.h
DataType/ObjectPool.h
DataType/Overlapped.h
DataType/Player.cpp
DataType/Player.h
DataType/Room.cpp
DataType/Room.h
DataType/Socket.cpp
DataType/Socket.h
NetworkModule/JHNETTool.cpp
NetworkModule/JHNETTool.h
NetworkModule/Log.cpp
NetworkModule/Log.h
NetworkModule/NetworkData.h
NetworkModule/PacketStruct.h
NetworkModule/PacketStructMacro.h
NetworkModule/Serializer.cpp
NetworkModule/Serializer.h
NetworkModule/UtilityMacro.h
NetworkModule/ConfigParser/ConfigParser.cpp
NetworkModule/ConfigParser/ConfigParser.h
Server/EpollServer.cpp
Server/EpollServer.h
Server/IOCPServer.cpp
Server/IOCPServer.h
Server/ServerNetworkSystem.cpp
Server/ServerNetworkSystem.h
TCP/TCPReceiveProcessor.cpp
TCP/TCPReceiveProcessor.h
UDP/UDPReceiveProcessor.cpp
UDP/UDPReceiveProcessor.h
)
#Create Visual Studio Directories
foreach(FILE ${SRCS})
# Get the directory of the source file
get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)
# Remove common directory prefix to make the group
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")
# Make sure we are using windows slashes
string(REPLACE "/" "\\" GROUP "${GROUP}")
# Group into "Source Files" and "Header Files"
if ("${FILE}" MATCHES ".*\\.cpp")
set(GROUP "Source Files\\${GROUP}")
elseif("${FILE}" MATCHES ".*\\.h")
set(GROUP "Header Files\\${GROUP}")
endif()
source_group("${GROUP}" FILES "${FILE}")
endforeach()
#Inclue Headers
INCLUDE_DIRECTORIES(include .)
#Add Files
ADD_EXECUTABLE(JHNET ${SRCS})
#Enable Thread
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(JHNET Threads::Threads)
중간에 foreach를 추가한 이유는 이 링크(https://stackoverflow.com/questions/41078807/cmake-and-visualstudio-group-files-in-solution-explorer)를 보면 알 수 있다.
3. 빌드
이제 작성된 CMakeList를 토대로 윈도와 리눅스에 빌드 하면 된다!
빌드 방법은 각각 다음과 같다.
1. 윈도우 : mkdir WinBuild로 폴더를 만들고 cd WinBuild 후, cmake ..으로 빌드! 이후에 sln 파일을 실행.
2. 리눅스 : mkdir LinuxBuild로 폴더를 만들고 cd LinuxBuild 후, cmake ..으로 빌드! 이후에 실행 파일을 실행.
4. 개선점
Debug와 Release모드에 대한 스위칭을 어떻게 하는지,
그리고 정말 헤더와 소스 파일을 일일이 때려 박아야 하는가? 에 대한 의문이 아직 남는다.
방법을 찾으면 꼭 기록해야겠다.
'졸업 작품 > 서버' 카테고리의 다른 글
C++ 스핀락 구현 (0) | 2019.06.13 |
---|---|
졸작서버 AWS 사용기 (0) | 2019.06.08 |
TCP / UDP 패킷 분리(Split) 현상 합치기 (4) | 2019.06.01 |
C++ IOCP 서버 3. IOCP 구현 (작동부) (6) | 2019.05.16 |
C++ IOCP 서버 3. IOCP 구현 (초기화) (2) | 2019.05.15 |