CMake学習ノート——基礎編


最近多くのオープンソースプロジェクトのコンパイル配置ファイルがCMakeを使って書かれているのを見ました.そこで、時間をかけて勉強し、この文書を整理する準備をしています.簡単なプロジェクトを例にとって、CMakeの常用命令を紹介します.主にヘッダファイルの経路、ライブラリの生成、バイナリファイルの生成などの機能が含まれています.インストール、テストなどの機能は含まれていません.
いくつかの文法的規則
  • 変数を使用して、{}方式で値を取る
  • commmand(arg 1 arg 2...)コマンドパラメータは括弧で囲まれています.パラメータの間にスペースやセミコロンを使って
  • に分けられます.
  • コマンドサイズの書き込みには関係なく、パラメータと変数は、大文字と小文字に関する
  • である.
    簡単な例
    ディレクトリ構造
    .
    ├── CMakeLists.txt
    ├── include
    │   └── hello.h
    └── src
        ├── CMakeLists.txt
        ├── lib
        │   ├── CMakeLists.txt
        │   └── hello.c
        └── src
        ┊   ├── CMakeLists.txt
        ┊   └── main.c
    ソース
    CMakeLists.txt
    cmake_minimum_required(VERSION 3.9)
    
    project(HELLO)
    
    set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
    set(LIBRARY_DIR ${PROJECT_BINARY_DIR}/output/libs)
    set(BIN_DIR ${PROJECT_BINARY_DIR}/output/bin)
    
    include_directories(${INCLUDE_DIR})
    link_directories(${LIBRARY_DIR})
    
    MESSAGE(STATUS "##PROJECT_SOURCE_DIR is " ${PROJECT_SOURCE_DIR})
    MESSAGE(STATUS "##PROJECT_BINARY_DIR is " ${PROJECT_BINARY_DIR})
    
    set(EXECUTABLE_OUTPUT_PATH ${BIN_DIR})
    set(LIBRARY_OUTPUT_PATH ${LIBRARY_DIR})
    
    add_subdirectory(src)
    CMAKE_ミニムウREQUIRED(VERION version[FATALUERROR])
    このCMakefiles.txtサポートの最小CMakeバージョンを指定します.このコマンドは最上階のCMakefiles.txtに追加することを提案します.
    PROJECT(projectname[CXX][C][Java])
    プロジェクト名を定義します.名前にスペースがある場合は、引用符を使って囲む必要があります.プロジェクトサポートの言語も指定できます.この命令は2つのcmake変数を暗黙的に定義している._BINARY_DIRおよび_SOURCE_DIR、前者は編集経路を指す.後者は工程経路であるが、cmakeシステムはPROJECT_BINARY_DIRおよびPROJECT_SOURCE_DIR変数を予め定義しており、それぞれ_BINARY_DIR_SOURCE_DIRと一致する.
    SET(VER[VALE][CACHE TYPE DOCSTRING[FOCE])
    変数の設定
    INCLUDE_DIRECTORORES([AFTER_BEFOREE][SYSTEM]dir 1 dir 2...)
    ヘッダファイルの検索パスを追加します.パス間にスペースを使用します.パスにスペースが含まれている場合、二重引用符を使用してAFTERまたはBEFOREEパラメータによって、追加された経路は既存の経路の前かそれとも後かを制御することができる.
    LINK_DIRECTORORES(dir 1 dir 2)
    標準ではない共有ライブラリの検索パスを追加します.
    MESSAGE([SENDAGR𞓜STATUS𞓜FATALUERROR]「message to display」…)
    端末に情報を出力する.SEND_ERRORにエラーが発生し、生成プロセスがスキップされる.STATUSは、プレフィクスが−である情報を出力する.FATAL_ERRORは直ちにすべてのcmakeプロセスを終了する.
    EXECUTABLE_OUTUTUT_PATHとLIBRIARY_OUTUTUT_PATH
    最終的に生成されたバイナリファイルの保存先を指定します.中間ファイルは含まれません.
    ADD_SUBREECTORY(ソウム・ドゥル[binary udir][EXCLUDE FROMUALL])
    現在のプロジェクトに保存元ファイルのサブディレクトリを追加し、中間バイナリとターゲットバイナリファイルの保存位置EXCLUDE_FROM_ALLパラメータの意味は、このディレクトリをコンパイル中から除外することです.
    ./src/CMakeLists.txt
    add_subdirectory(src)
    add_subdirectory(lib)
    ./src/lib/CMakeLists.txt
    set(SRC_LIST hello.c)
    # set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output/lib)
    # add_library(libhello ${SRC_LIST})
    add_definitions(-DLIBHELLO_BUILD)
    add_library(hello_shared SHARED ${SRC_LIST})
    set_target_properties(hello_shared PROPERTIES OUTPUT_NAME "hello")
    set_target_properties(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)
    
    add_library(hello_static STATIC ${SRC_LIST})
    set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")
    ADD_DEFINITIONS(-Ddef 1-Ddef 2...)
    コンパイルパラメータをC/C++コンパイラに追加し、パラメータ間をスペースで区切ってCMAKE_を使用することもできます.C_FLAGSまたはCMAKE_CXX_FLAGSはC/C++コンパイルオプションの設定です.
    ADD_LIBRIRY(libname[SHARED𞓜STATIC MODULE][EXCLUDE FROMUALL]source 1 source 2…sourceN]
    一つのライブラリファイルを生成します.dyldがサポートされていないシステムでは、MODULEはSHAREDとして扱われます.
    SET_TARGETPROPRERTIES(targt 1 target 2…PROPRERTIES prop 1 value 1 prop 2 value 2…)
    出力の名前を設定するために使用され、ダイナミックライブラリのバージョンまたはAPIのバージョンを指定するために使用されてもよい.TARGETPROPARTY(VER target property)
    ./src/src/CMakeLists.txt
    set(LIB_LIST hello.so)
    set(SRC_LIST main.c)
    # set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/output/bin)
    add_executable(hello ${SRC_LIST})
    target_link_libraries(hello ${LIB_LIST})
    ADD_EXECUTABLE(taget source...)
    タレッジという実行可能ファイルを生成するCMakeは依存関係を自動的に処理しますので、Ourceではヘッダファイルを一覧表示する必要はありません.PS:CMakeは同名でヘッダファイルを検索します.この場合、同じ名前のヘッダ以外のファイルは、sourceに追加されますか?
    TARGETLINK_LIBRIIES(dir 1 dir 2…)
    標準ではない共有ライブラリの検索パスを追加します.
    ./include/hello.h
    #ifndef _HELLO_H
    #define _HELLO_H
    
    #if defined _WIN32
        #if LIBHELLO_BUILD#define LIBHELLO_API __declspec(dllexport)
        #else#define LIBHELLO_API __declspec(dllimport)
        #endif
    #else
        #define LIBHELLO_API
    #endif
    LIBHELLO_API void hello();
    
    #endif
    ./src/lib/hello.c
    #include 
    #include 
    
    void hello()
    {
        printf("hello
    "
    ); }
    ./src/src/main.c
    #include 
    #include 
    
    #include "hello.h"
    
    int main(int argc, char *argv[])
    {
        hello();
    
        return 0;
    }
    構築プロジェクト
    ビルドコマンド# cmake -G -G は、CMakeがどのような種類のプロジェクトファイルを生成すべきかを教えてくれます.
    注意事項
    プロジェクトの下でbuildディレクトリを作成し、buildディレクトリに入り、cmake -G "Unix Makefiles" ../を実行します.このときはbuildディレクトリの下でMakefileを生成し、いくつかの中間ファイルはプロジェクトディレクトリの下でcmake -G "Unix Makefiles" ./を実行してはいけません.このため、プロジェクトディレクトリの下でMakefileといくつかの中間ファイルを生成します.これらのファイルはコマンドによって整理できません.make VERRBOSE=1コマンドでコンパイルできます.