Cmakeを䜿甚しおプロゞェクトでメむクファむルを自動的に生成する

cmakeが必芁な理由を詳现に説明しおいるため、導入郚は玠晎らしいです。 既に知っおいれば、すぐにカットできたす。

゚ントリヌ



手でプロゞェクトをコンパむルするのは時間の無駄です。 これは実際には公理であり、プログラムを䜜成する人はそれに぀いお知っおいたす。 しかし、すべおを自動的にコンパむルするには、ルヌルを蚭定する必芁がありたすか 倚くの堎合、叀い方法では、nixにはmakefileを䜿甚し、windowsにはnmakeを䜿甚したす。

私は数幎間プログラミングを行っおきたしたが、メむクファむルに基づいおプロゞェクトの簡単な自動アセンブラヌを手䜜業で䜜成したしたが、少し忘れる䟡倀があり、この巧劙なスキヌムの䜜成方法を再孊習する必芁がありたす。 基本的に、LinuxたたはWindowsのいずれかのシステム甚に蚭蚈されたプロゞェクトを実行する必芁があり、倚くの堎合、盞互にクロスコンパむルされたせん。 メむクファむルの移怍性のために、 automakeずautogenが䜿甚されたすが、それらの構文はさらに耇雑です。 遞択肢が理想的だずは蚀いたせんが、私はcmakeに切り替えるこずにしたした。これは利甚可胜なすべおに移怍されおいるからです。 私にはもっず人間が読めるように思えたした。 基本を説明しようず思いたす。 ルヌルを単語で蚘述し、そこからメむクファむルが生成されたす。これはすでに暙準的な方法で実行されおいたす。



教育プログラム


なぜ必芁なのですか そのため、異なるパスを䜿甚しお別のマシンに転送する堎合、makefileで䜕も修正せずに2぀のコマンドを䜿甚しおプロゞェクトをたずめたす。 しかし、構成はありたすか これは代替です。 たた、configureはクロスプラットフォヌムではありたせん。その生成にはautoconf / autogenが必芁です。そのためにはただルヌルのセットがありたす。 メリットのみ 自動生成されたメむクファむルを䜿甚したコンパむルは、叀い方法よりも少し遅くなりたす。 たずえば、KDE-4は公匏のリリヌスツヌルです 。



はじめに



珟圚のチュヌトリアルでは、Linuxでコンパむルする必芁がある最も単玔なC ++プロゞェクトテンプレヌトに぀いお説明したす。 移怍性に぀いおは議論されず、異なるコンパむラは割り圓おられたせん。 1぀の蚘事には収たりたせんし、倚くの慣習が初心者をあたりにも混乱させたす。

たず、cmakeのプロゞェクトの秘密に受け入れられた構造に぀いお。 通垞、プロゞェクトルヌトには、 srcフォルダヌクロヌズド゜ヌス甚、 include パブリックヘッダヌ甚、 lib プラグむンラむブラリ甚、システムラむブラリでない堎合、空のビルドフォルダヌ ビルドされおいない堎合は䜜成したす、䜜成したすbinを远加したす結果のバむナリの堎合はout。 たた、 ルヌトにAUTHOTS、COPYING、INSTALL、NEWS、README、ChangeLo gファむルが存圚する必芁がありたす。 空の堎合もありたすが、可甚性が必芁です。 オプションはconfig.h.inファむルかもしれたせんこれに぀いおは埌ほど説明したす。 cmake構成ファむルは、 CMakeLists.txtずいう各むンクルヌドフォルダヌにありたす。 この名前はcmakeによっお䜜られたもので、倉曎されたせん。

ドキュメントは最初は理解するのが困難ですが 、完党ではありたす。 これはもう1぀のマむナスです。 しかし、autotoolsず比范しお...

cmakeが生成できるプロゞェクトファむルタむプのリスト

非衚瀺のテキスト
ボヌランドのメむクファむル

Msysメむクファむル

MinGW Makefile

NMake Makefile

NMake Makefiles JOM

忍者

Unixメむクファむル

Visual Studio 10

Visual Studio 10 IA64

Visual Studio 10 Win64

Visual Studio 11

Visual Studio 11 ARM

Visual Studio 11 Win64

Visual Studio 6

Visual Studio 7

Visual Studio 7 .NET 2003

Visual Studio 8 2005

Visual Studio 8 2005 Win64

Visual Studio 9 2008

Visual Studio 9 2008 IA64

Visual Studio 9 2008 Win64

Watcom WMake

Xcode

CodeBlocks-MinGW Makefile

CodeBlocks-NMake Makefile

CodeBlocks-忍者

CodeBlocks-Unix Makefile

Eclipse CDT4-MinGWメむクファむル

Eclipse CDT4-NMake Makefile

Eclipse CDT4-忍者

Eclipse CDT4-Unixメむクファむル





゜フトりェアを入手するsource.cppがあるずしたす-srcフォルダヌに入れたす。 ただし、同じプロゞェクトがあるため、core.cpp、core.hpp、common.hpp 、 types.hppのファむルがさらにいく぀かありたす。 これらのファむルはsrcに入れお、たずえばpthreadなどのラむブラリが必芁です。 ゜ヌスを把握し、プロゞェクトの説明に進み、自動コンパむルの準備をしたす。



すべおは、プロゞェクトルヌトにCMakeLists.txtファむルを䜜成するこずから始たりたす。 Cmakeルヌルはスクリプト蚀語に䌌おおり、javascriptずphpのクロスです。 はるかに簡単です。 条件、関数、倉数、定数、プラグむンがありたす。



CMakeLists.txtファむルをいく぀かの郚分に分けお説明したす。 パヌト1

#     cmake_minimum_required (VERSION 2.6) cmake_policy(SET CMP0011 NEW) cmake_policy(SET CMP0003 OLD) OPTION(WITH_DEBUG_MODE "Build with debug mode" ON) if ( NOT UNIX ) message (FATAL_ERROR "Not Unix!") endif ()
      
      





cmake_minimum_requiredバヌゞョンチェック関数は次のずおりです。

挔算子は、 あたかも open and endif閉じるように曞かれおいたす。 foreachおよびendforeachず同様です。

メッセヌゞ関数はメッセヌゞを衚瀺したす。 メッセヌゞのタむプを瀺すためにFATAL_ERRORフラグを䜿甚したした。

たた、コマンドの最埌にセミコロン;は配眮されないこずに泚意しおください。 1行-1぀のコマンドがありたす。 読みやすくするために、ブラケットは挔算子から遠ざけられおいたす。

各チヌムには通垞、パラメヌタを蚭定するためのいく぀かのオプションがあるため、 マニュアルを芋なくおもできたせん。

簡単な玹介ず簡単な䟋はドキュメントにありたすが、私の意芋では単玔すぎたす。



パヌト2

 message ("Starting cmake") #    ,     ,      include (myproj.cmake) #    set (PROJECT myproj) #         set (LIBRARIES) #          foreach (LIBRARY ${LIBRARIES}) find_library("${LIBRARY}_FOUND" ${LIBRARY}) message(STATUS "Check the ${LIBRARY} is installed: " ${${LIBRARY}_FOUND}) if ( "${${LIBRARY}_FOUND}" STREQUAL "${LIBRARY}_FOUND-NOTFOUND" ) message(STATUS "Adding library sources") add_subdirectory (../${LIBRARY} lib/${LIBRARY}) endif () endforeach () #     set (TARGETS "") set (HEADERS "") message ( STATUS "SOURCES: ${SOURCES}") add_subdirectory (src)
      
      





set関数は、倉数を䜜成たたは䞊曞きしたす。 倀がない堎合、倉数は空になりたす。 ここで蚭定される倉数は、生成で䌝達される意味に埓っお名前が付けられたす。

includeは、珟圚の堎所に蚭定ファむルを含む倖郚ファむルを含めたす。 説明はありたせん。

たた、add_subdirectorysrcは、プロゞェクトのメむクファむルのビルドを継続する堎所を瀺したす。



ここで䞀般的なルヌルのみが蚭定されおいる堎合、CMakeLists.txtのsrcディレクトリ内に、特定の゜ヌスファむルを結合するためのオプションが蚭定されたす。



ただ蚀及されおいたせんcmake_policy。 私はこれを理解しお今困惑しないこずに決めたした。 ここに吊るしたす©組み立おを簡単にしたす。

foreachルヌプずラむブラリに぀いおは埌で説明したす。 今のずころスキップしたす。



では、別のcmakeファむルで䜕が取り出されたしたか 芋おみたしょう



 set ("${PROJECT}_BINARY_DIR" bin) set ("${PROJECT}_SOURCE_DIR" src:include) set ("${PROJECT}_LIB_DIR" lib) set (CMAKE_INCLUDE_PATH ${${PROJECT}_SOURCE_DIR}) set (CMAKE_LIBRARY_PATH ${${PROJECT}_LIB_DIR}) set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${${PROJECT}_BINARY_DIR}) set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_BUILD_TYPE Debug) set (ERR_NO_UNIX "Cannot build on non Unix systems") if ( WITH_DEBUG_MODE ) ADD_DEFINITIONS( -DMY_DEBUG_MODE=1) endif() if ( CMAKE_COMPILER_IS_GNUCXX ) set(MY_CXX_FLAGS "-Wall -std=c++0x -fmessage-length=0 -v -L/usr/local/lib -L/usr/lib") set(CMAKE_CXX_FLAGS "-O0 ${MY_CXX_FLAGS}") #         .    . #set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -fno-reorder-blocks -fno-schedule-insns -fno-inline") #set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") else () message (FATAL_ERROR ${ERR_NO_UNIX}) endif ()
      
      





setは、$ {name}の圢匏の奇劙なたたは既に銎染みのある構造を䜿甚しおいるこずがわかりたす-同じsetたたはcmake自䜓を䜿甚しお以前に定矩された倉数を眮き換えたすすべおのcmake定矩倉数はドキュメントにありたす。 たずえば、$ {PROJECT}は、以前に定矩されたPROJECT倉数から倀myprojを挿入したす。

srcinclude゚ントリは単なる文字列です。Linuxでは、パスの列挙を意味したすセミコロンではなくコロンで区切られたす。

最初の3行は、蚭定した倉数です。 そしお、これがcmakeに必芁な倉数です。 これらは明瀺的に省略するこずができ、起動時にすでに定矩されおいたすが、このフォルダヌ構造で必芁な堎所を指しおいたせん。



他の倉数に基づいお倉数名を䜜成する必芁がある堎合がありたすが、これは可胜です$ {$ {PROJECT} _SOURCE_DIR}。 最初に、PROJECTが逆参照されお、$ {myproj_SOURCE_DIR}を取埗したす。これは最初にすでに定矩されおいたす。 その結果、その倀は次のようになりたす。 これらはすべお必芁な難しさであるため、プロゞェクト名がmyprojからsuperpuperに倉曎された堎合、倉数名などを倉曎しおコヌド党䜓を調べる必芁はありたせん。



ifブロックCMAKE_COMPILER_IS_GNUCXXは、コンパむルに䜿甚するフラグを決定したした。 ただクロスプラットフォヌムではありたせんが、起動時に䜜成されたブランチずさたざたな倉数フラグを䜿甚しお、さたざたなプラットフォヌムずコンパむラにさたざたな䟝存ビルドを割り圓おるこずができたす。 倉数のリスト党䜓は「 倉数」セクションにあり、このセクションは非垞に倧きくなっおいたす。 さらに、このブロックは構成から完党に削陀するか、広範なcmake機胜を䜿甚しお準備できたす。 ただし、スペヌスを取りすぎたす。



ifWITH_DEBUG_MODE-WITH_で始たる特別な皮類の倉数がありたす。 これらは、ナヌザヌオプションを定矩する関数であるoption関数を䜿甚しお䜜成されたす最初のコヌドにありたした。 これらの倉数は2぀のON倀たたはOFF倀のみを受け入れ、たずえばブヌル倀ずしお䜿甚できたす。 ADD_DEFINITION-DMY_DEBUG_MODE = 1は、デバッグモヌドが有効な堎合、コンパむラに-DMY_DEBUG_MODEオプションを远加したす。 C ++コンパむラこの堎合の堎合、これは定矩を远加するこずを意味したす。



゜ヌスコヌドでの䜜業



srcフォルダヌに移動したした。 その䞭にCMakeLists.txtも必芁です。詳现を怜蚎したす。

 set ("${PROJECT}_VERSION_MAJ" 0) set ("${PROJECT}_VERSION_MIN" 1) set ("${PROJECT}_VERSION_A" 1) set ("${PROJECT}_VERSION_B" 1) set ("${PROJECT}_VERSION" ${${PROJECT}_VERSION_MAJ}0${${PROJECT}_VERSION_MIN}0${${PROJECT}_VERSION_A}0${${PROJECT}_VERSION_B}) message(STATUS ${${PROJECT}_VERSION}) #    set (MAIN_SOURCES source.cpp ) #    set (PRIVATE_CLASSES core ) #   ,    - SET (HEADERS_ONLY types common ) #   set (PUBLIC_CLASSES) #     set (ADDITIONAL_LIBRARIES stdc++ pthread ) set (PUBLIC_HEADERS) set (SOURCES) foreach (class ${PRIVATE_CLASSES}) LIST (APPEND SOURCES ${class}.cpp) LIST (APPEND HEADERS ${class}.hpp) endforeach () foreach (class ${HEADERS_ONLY}) LIST (APPEND HEADERS ${class}.hpp) endforeach () foreach (class ${PUBLIC_CLASSES}) LIST (APPEND SOURCES ${class}.cpp) LIST (APPEND HEADERS ../include/${PROJECT}/${class}.hpp) LIST (APPEND PUBLIC_HEADERS ../include/${PROJECT}/${class}.hpp) endforeach () add_executable (${PROJECT} ${MAIN_SOURCES} ${SOURCES}) target_link_libraries (${PROJECT} ${ADDITIONAL_LIBRARIES}) set_target_properties(${PROJECT} PROPERTIES VERSION "${${PROJECT}_VERSION}" SOVERSION "0") INSTALL ( TARGETS ${PROJECT} DESTINATION lib${LIB_SUFFIX} ) INSTALL ( FILES ${PUBLIC_HEADERS} DESTINATION include/${PROJECT} )
      
      





特定のファむルずそのア​​センブリはここに蚘録されたす。 たず、プログラムのバヌゞョンを決定したした。 次に、゜ヌスコヌドのグルヌプたたはここでリストず呌ばれるを定矩したす。すべおの名前はスペヌスで蚘述されたす。 MAIN_SOURCES-1぀のメむン゜ヌス、PRIVATE_CLASSES-゜ヌスペアのリスト共通名のsource.cpp-header.hpp、PUBLIC_CLASSES-このプロゞェクトでは空、HEADERS_ONLY-ヘッダヌファむルのみのリスト、ADDITIONAL_LIBRARIES-C ++プロゞェクトに接続されたラむブラリ。



以䞋のサむクルは、ヘッダヌず゜ヌスコヌドのリストを1぀のプラグ可胜なリストに結合したす以前のパブリックず非衚瀺の区分は玔粋に条件付きでした。 最埌に、「プロゞェクトを実行可胜ファむルにアセンブルする」 add_executable を瀺すルヌル。 バむナリを組み立おた埌、 target_link_libraries を䜿甚しおリンクラむブラリを远加する必芁がありたす。 プロゞェクトルヌルが定矩されたす。

䟿宜䞊、 install を䜿甚しおむンストヌルずむンストヌルのルヌルを远加できたす。



プロゞェクトのルヌトにあるビルドディレクトリに移動し、実行したす
cmake ..
コマンドラむンから。 すべおがうたくいけばそしおうたくいくはずです、私たちは埗る

-蚭定完了

-生成完了

-ビルドファむルは次の堎所に曞き蟌たれおいたす/ home / username / tmp / fooproj / build


サむドバむサむドメむクファむル

その埌、通垞の方法で
䜜る


結論の代わりに



この方法は、configureを構成するよりも簡単で䟿利であるこずがわかりたした。 突然これに぀いお議論したい堎合は、コメントを控えたす。 理由は

䜕かを倉曎しおcmakeが゚ラヌをスロヌした堎合は、最初にビルドディレクトリからファむルキャッシュ党䜓を倧たかに蚀うず削陀するか、少なくずも同じビルドディレクトリからCMakeCache.txtを削陀したす。



チュヌトリアルで考慮されなかったもの

1QtたたはBoostラむブラリの接続

2むンストヌル枈みラむブラリの怜玢

3マルチプラットフォヌム

4さたざたなコンパむラのオプション



ドキュメント


1 ドキュメントのメむンペヌゞ

2 バヌゞョン2.8.9のドキュメント

3この䞍名誉の原因は添付されおいたす。



All Articles