By | 2018年2月15日

おりばーです。最近もなかなか忙しくすっかり更新が止まってしまいました。。
普段C++の開発でCMakeを使っているのですが、クロスコンパイルすることが多くクロスコンパイルに対応したCMakeを作ったのでメモ。



プロジェクトルートのCMakeLists.txtに下記のコードを配置してください

## cmake version
cmake_minimum_required( VERSION 3.2 )
 
## Active C++11
set (CMAKE_CXX_STANDARD 11)
 
## ビルドタイプ (今回はデバッグビルド)
SET(CMAKE_BUILD_TYPE Debug)
#SET(CMAKE_BUILD_TYPE Release)
 
## プロジェクト名
set(ROOT_PROJECT_NAME "AwesomeProject")
project( ${ROOT_PROJECT_NAME} CXX)
 
## プロジェクトルート(子のCMakeListsに波及させるため)
set(PROJECT_ROOT_DIR ${PROJECT_SOURCE_DIR} )
 
## インクルードファイル
file(GLOB HEADER_FILES
    ${PROJECT_SOURCE_DIR}/include/*.h
    ${PROJECT_SOURCE_DIR}/include/*.hh
)

## ソースファイル
file(GLOB SOURCE_FILES
    ${PROJECT_SOURCE_DIR}/src/*.cpp
)

## C++コンパイラ
if(MSVC)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT /FAcs")
    
    # WINDOWS用。サブシステムをWindows(GUI)にする
    if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS")
    endif()   
else()
    ## gccなど
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -fdata-sections -ffunction-sections")
 
    set( CMAKE_CXX_FLAGS_DEBUG "-g -O0" )
    set( CMAKE_CXX_FLAGS_RELEASE "-O3" )
 
    ## XCodeなど
    if(APPLE)
        include_directories("/usr/include/linux")
        set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip -Wnull-conversion -Xlinker -all_load")
    else()
        set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_NAME}.map,--gc-sections")
    endif()
endif()
 
## 静的リンク(*.lib,*.a)
add_library(${PROJECT_NAME}_static STATIC ${HEADER_FILES} ${SOURCE_FILES})
 
## 動的リンク(*.dll, *.so)
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})

## 実行ファイル(*.exe, *.a)
#add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})