サーチ…
前書き
備考
現在、普及しているクロスプラットフォームである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)
このファイルは、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標準に準拠するオペレーティングシステムに接続されているパッケージマネージャとの関係も持っています。