サーチ…


前書き

C ++は、Cのように、コンパイルのワークフローやビルドプロセスに関する歴史が長く、様々です。現在、C ++には、プログラムをコンパイルするために使用される、さまざまな一般的なビルドシステムがあります。ここでは、いくつかのビルドシステムを見直して分析します。

備考

現在、普及しているクロスプラットフォームであるC ++のための普遍的なまたは支配的なビルドシステムは存在しません。しかし、主要なプラットフォーム/プロジェクトにはいくつかの主要なビルドシステムが存在しますが、最も注目すべきはGNU / LinuxオペレーティングシステムではGNU Make、Visual C ++ / Visual StudioプロジェクトシステムではNMAKEです。

さらに、一部の統合開発環境(IDE)には、ネイティブIDEで特別に使用される特殊なビルドシステムも含まれています。特定のビルドシステムジェネレータは、Eclipse用のCMakeやMicrosoft Visual Studio 2012などのネイティブIDEビルドシステム/プロジェクトフォーマットを生成できます。

CMakeを使ったビルド環境の生成

CMakeは、ほぼすべてのコンパイラやIDE用のビルド環境を単一のプロジェクト定義から生成します。次の例は、 クロスプラットフォームの "Hello World" C ++コードに CMakeファイルを追加する方法を示します

CMakeファイルは常に "CMakeLists.txt"という名前で、すべてのプロジェクトのルートディレクトリに存在するはずです(サブディレクトリも可能です)。基本的なCMakeLists.txtファイルは以下のようになります:

cmake_minimum_required(VERSION 2.4)

project(HelloWorld)

add_executable(HelloWorld main.cpp)

それはColiru生きて見てください

このファイルは、CMakeにプロジェクト名、期待するファイルのバージョン、 main.cppが必要な "HelloWorld"という実行可能ファイルを生成するための指示を伝えます。

インストールされたコンパイラ/ IDE用のビルド環境をコマンドラインから生成します。

> cmake .

次のようにアプリケーションをビルドします。

> cmake --build .

これにより、OSおよびインストールされているツールに応じて、システムのデフォルトのビルド環境が生成されます。 「アウトソース」ビルドを使用して、ビルド成果物からソースコードをきれいに保つ:

> mkdir build
> cd build
> cmake ..
> cmake --build .

CMakeは、前の例のプラットフォームシェルの基本コマンドを抽象化することもできます:

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 

CMakeには、いくつかの一般的なビルドツールとIDE用のジェネレータが含まれています。 Visual Studioのnmakeメークファイルを生成するには:

> cmake -G "NMake Makefiles" ..
> nmake

GNU makeでコンパイルする

前書き

GNU Make(styled make )は、シェルコマンドを実行するための自動化プログラムです。 GNU Makeは、Makeファミリに属する​​特定のプログラムです。 makeは、Linuxカーネル、Mac OS X、およびBSDから派生したものを含むUnixライクなオペレーティングシステムとPOSIXライクなオペレーティングシステムの間で人気があります。

GNU Makeは、一般的なGNU / Linuxオペレーティングシステムに付属しているGNUプロジェクトに添付されていることで特に注目に値する。 GNU Makeには、WindowsとMac OS Xの様々な味で動作する互換バージョンもあります。これは歴史的な意味を持つ非常に安定したバージョンでも人気があります。これらの理由から、GNU MakeはしばしばCやC ++と一緒に教えられます。

基本的なルール

makeでコンパイルするには、プロジェクトディレクトリにMakefileを作成します。あなたのMakefileは次のようにシンプルになります:

メークファイル

# Set some variables to use in our command
# First, we set the compiler to be g++
CXX=g++

# Then, we say that we want to compile with g++'s recommended warnings and some extra ones.
CXXFLAGS=-Wall -Wextra -pedantic

# This will be the output file
EXE=app

SRCS=main.cpp

# When you call `make` at the command line, this "target" is called.
# The $(EXE) at the right says that the `all` target depends on the `$(EXE)` target.
# $(EXE) expands to be the content of the EXE variable
# Note: Because this is the first target, it becomes the default target if `make` is called without target
all: $(EXE)

# This is equivalent to saying
# app: $(SRCS)
# $(SRCS) can be separated, which means that this target would depend on each file.
# Note that this target has a "method body": the part indented by a tab (not four spaces).
# When we build this target, make will execute the command, which is:
# g++ -Wall -Wextra -pedantic -o app main.cpp
# I.E. Compile main.cpp with warnings, and output to the file ./app
$(EXE): $(SRCS)
    @$(CXX) $(CXXFLAGS) -o $@ $(SRCS)

# This target should reverse the `all` target. If you call
# make with an argument, like `make clean`, the corresponding target
# gets called.
clean:
    @rm -f $(EXE)

注:インデントが4つのスペースではなく、タブで確実に行われるようにしてください。そうしないと、 Makefile:10: *** missing separator. Stop. がないというエラーが表示されます Makefile:10: *** missing separator. Stop.

これをコマンドラインから実行するには、次のようにします。

$ cd ~/Path/to/project
$ make
$ ls
app  main.cpp  Makefile

$ ./app
Hello World!

$ make clean
$ ls
main.cpp  Makefile

インクリメンタルビルド

より多くのファイルを作成し始めると、makeがより便利になります。 b.cppではなくa.cppを編集するとどうなりますか? b.cppを再コンパイルすると時間がかかります。

次のディレクトリ構造を使用します。

.
+-- src
|   +-- a.cpp
|   +-- a.hpp
|   +-- b.cpp
|   +-- b.hpp
+-- Makefile

これは良いMakefileでしょう:

メークファイル

CXX=g++
CXXFLAGS=-Wall -Wextra -pedantic
EXE=app

SRCS_GLOB=src/*.cpp
SRCS=$(wildcard $(SRCS_GLOB))
OBJS=$(SRCS:.cpp=.o)

all: $(EXE)

$(EXE): $(OBJS)
    @$(CXX) -o $@ $(OBJS)

depend: .depend

.depend: $(SRCS)
    @-rm -f ./.depend
    @$(CXX) $(CXXFLAGS) -MM $^>>./.depend

clean:
    -rm -f $(EXE)
    -rm $(OBJS)
    -rm *~
    -rm .depend

include .depend

もう一度タブを見てください。この新しいMakefileを使用すると、変更されたファイルのみを再コンパイルし、コンパイル時間を最小限に抑えることができます。

ドキュメンテーション

makeの詳細については、Free Software Foundationの公式ドキュメント 、stackoverflowのドキュメントdmckeeの stackoverflowに関する 精巧な答えを参照してください。

SConsで構築する

Scons - Python言語のソフトウェア構築ツールを使用して、 クロスプラットフォームの "Hello World" C ++コードを構築することができます。

最初に、 SConstructというSConstructファイルを作成します(SConsはデフォルトでこの正確な名前のファイルを探します)。今のところ、ファイルはhello.cpp沿ったディレクトリになければなりません。新しいファイルに行を書き込む

 Program('hello.cpp')

今、端末から、 scons実行しscons 。あなたは何かのように見えるはずです

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello.o -c hello.cpp
g++ -o hello hello.o
scons: done building targets.

(詳細はお使いのオペレーティングシステムとインストールされているコンパイラによって異なります)。

EnvironmentクラスとGlobクラスは、構築するものをさらに構成するのに役立ちます。例えば、 SConstructファイル

env=Environment(CPPPATH='/usr/include/boost/',
    CPPDEFINES=[],
    LIBS=[],
    SCONS_CXX_STANDARD="c++11"
    )

env.Program('hello', Glob('src/*.cpp'))     

srcすべてのcppファイルを使用して、実行可能なhelloをビルドします。そのCPPPATH/usr/include/boostあり、C ++ 11標準を指定します。

忍者

前書き

忍者ビルドシステムは、プロジェクトウェブサイトで「スピードに重点を置いた小型ビルドシステム」として記述されています。 Ninjaは、システムファイルを構築することでファイルを生成するように設計されており、CMakeやMesonなどの高レベルビルドシステムマネージャとは対照的に、システムを構築するための低レベルのアプローチを採用しています。

Ninjaは、主にC ++とPythonで書かれており、ChromiumプロジェクトのSConsビルドシステムの代替として作成されました。

NMAKE(Microsoftプログラムメンテナンスユーティリティ)

前書き

NMAKEは、主にMicrosoft Visual Studioおよび/またはVisual C ++コマンドラインツールと組み合わせて使用​​するためにMicrosoftによって開発されたコマンドラインユーティリティです。

NMAKEはビルドシステムのMakeファミリに属する​​ビルドシステムですが、Windows固有のファイルパス構文(Unixスタイルのファイルパスとは異なります)をサポートするなど、UnixライクなMakeプログラムとは異なるいくつかの異なる機能を備えています。

オートツール(GNU)

前書き

オートツールは、特定のソフトウェアパッケージ用のGNUビルドシステムを作成するプログラム群です。 Makefile(GNU Makeで使用される)など、さまざまなビルドリソースを生成するために一緒に働く一連のツールです。したがって、Autotoolsは事実上のビルドシステムジェネレータと考えることができます。

注目すべきAutotoolsプログラムには、

  • Autoconf
  • Automake( makeと混同しないでください)

一般に、AutotoolsはUnix互換のスクリプトとMakefileを生成して、以下のコマンドが(ほとんどのパッケージをビルドするだけでなく)インストールできるようにしています。

./configure && make && make install

したがって、Autotoolsは、特定のパッケージマネージャ、特にPOSIX標準に準拠するオペレーティングシステムに接続されているパッケージマネージャとの関係も持っています。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow