🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1848閲覧

c++での作業の進め方について

退会済みユーザー

退会済みユーザー

総合スコア0

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/11/29 16:07

編集2019/11/30 08:29

##前提
私は現在c++でプログラミングをするとき
下記のようなディレクトリの構造からスタートします。

まずmain関数を記したmain.hppとmain.cppを作成してから
作りたいモジュールをmodule.hppとmodule.cppに記したあとに
まだ必要なモジュールがあるならmodule2.hppとmodule2.cppを追加して
それでもまだ必要なモジュールがあるなら上記の作業を繰り返してます。

そして最後にmakeコマンドでコンパイルして実行ファイルを作成します。

この作業はプログラミングの練習をしているぶんには問題ないと感じております
しかしgithubなどで様々なプロジェクトを眺めてみるとこの作業方法をとってる
プロジェクトを見た事がありません。
なので皆様がどのような方法でc++で作業を進めていくのかとても気になるので
"自分はこんな作業手順で作っていく"や
"自分はこんなディレクトリで作業している"
など具体的に教えていただけたらとてもうれしいです。

また具体例でなくとも"こんなキーワードで調べたら良い"や
"こんな本をを読めばわかる"などのご意見もお待ちしております

どうかご指摘やご回答をよろしくお願いします。

terminal

1. 2├── bin 3│   └── a.out 4├── include 5│   ├── main.hpp  6│   └── module.hpp 7├── makefile 8├── obj 9│   ├── main.d 10│   ├── main.o 11│   ├── module.d 12│   └── module.o 13└── src 14 ├── main.cpp 15 └── module.cpp 16 17備考1:main.hppとmain.cppはmain関数を含む処理の主軸となるファイルである。 18備考2:module.hppとmodule.cppは自作のライブラリを記載したファイルである。

ちなみにmakefileの中身は下記の通りです。

makefile

1COMPILER = g++ 2CFLAGS = -g -MMD -MP -Wall -Wextra 3 4INCLUDE = -I./include 5TARGET = ./bin/a.out 6SRCDIR = ./src 7 8SOURCES = $(wildcard $(SRCDIR)/*.cpp) 9OBJDIR = ./obj 10 11OBJECTS = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o))) 12DEPENDS = $(OBJECTS:.o=.d) 13 14$(TARGET): $(OBJECTS) 15 $(COMPILER) -o $@ $^ $(LDFLAGS) 16 17$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 18 -mkdir -p $(OBJDIR) 19 $(COMPILER) $(CFLAGS) $(INCLUDE) -o $@ -c $< 20 21all: clean $(TARGET) 22 23clean: 24 -rm -f $(OBJECTS) $(DEPENDS) $(TARGET) 25 26-include $(DEPENDS) 27

##補足情報(FW/ツールのバージョンなど)
os: LinuxMint18.2(Cinamon)
コンパイラ: g++ 5.4.0
make: GNU Make 4.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

一般的にはMakefileは自分で書きません。
autotoolsやcmakeなどのツールで、Makefileを自動生成します。

このようなツールを使うメリットは、

  • (Makefileを直に書くよりかは)環境に依存しない。
  • 依存するライブラリの対応
  • (特にlinuxなど)ディストリビューションのパッケージの作成のしやすさ

などが挙げられます。
デメリットは、各ツールでの使い方があるので、それを覚えなければならない点ですね。

昔はautotools一択でしたけど、GNUツールへの依存が大きいのが欠点ですね。
cmakeの方がVisualStudioでも使えて、便利です。

投稿2019/11/29 19:17

katsuko

総合スコア3538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/29 20:13 編集

katsuko様 ご回答誠にありがとうございます。 Makefileは一般的に自分で書かないものなのですね... maai様より"IDEを使ったほうが良い"と御回答を頂いたので Linuxで使えてなお無料のEclipseと katsuko様からのご提案であるCMakeを組み合わせて使用すれば 更に効率的に作業ができるのかなと感じました。 貴重な御意見誠にありがとうございます。 ベストアンサーにつきましては様々な方のご回答を拝見してから 決めたいと考えておりますのでもう少し様子を見て決めようと考えております。
guest

0

ベストアンサー

こんにちは。

疑問点は、作業の進め方なのでしょうか?
どんなプロジェクトでも、「必要なソースを作り、ビルド・システムを構築し、ビルドしてデバッグする」、「必要に応じてソースを追加する」という作業手順は異なることはないと思います。diodeさんの手順も同様ですね。

しかしgithubなどで様々なプロジェクトを眺めてみるとこの作業方法をとってる

プロジェクトを見た事がありません。

そんなことはありません。多数のコミットがあるプロジェクトで一度もソースを追加したことがないプロジェクトは存在しないのでは?


ビルド・ツリーとソース・ツリーが入り混じっているのは、結構デメリットが多いです。
CMake : out-of-sourceビルドで幸せになる」という記事がありました。CMakeはこの2つを分ける、分けないどちらも対応していますが、分けた方が幸せという記事ですね。この記事で書かれている分けることのメリット/デメリットはCMake限定ではなく一般的な話です。

他に気になった点としては、includeとsrcフォルダが別れていることですね。
ソース・ツリー上でこの2つを分けているプロジェクトの方が多いのですが、個人的には分けない方が生産性は上がりやすいと感じます。例えばmodule.hppとmodule.cppを両方同じように修正することは多々あります。その際、近くに配置した方が楽なように感じます。微細差ですが「チリも積もれば」です。

投稿2019/11/30 04:38

編集2019/11/30 04:41
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/30 08:39

Chironian様 御指摘ありがとうございます。 少しでも質問がわかりやすくなればと思い 質問内容を一部変更しました。
退会済みユーザー

退会済みユーザー

2019/11/30 09:12

Chironian様 ご回答誠にありがとうございます。 includeフォルダとsrcフォルダをわけないほうが良い。 や記事の紹介などの 具体的なアドバイス大変ありがとうございます。 じっくり紹介していただいた記事を読んで考えてみます。 ベストアンサーにつきましては様々な方のご回答を拝見してから 決めたいと考えておりますのでもう少し様子を見て決めようと考えております。
guest

0

最近、やってないけど、以前(10年以上前)は、結構、makefileは書いてました。
どこまで、凝った事をしたいかによりますが、特に問題は無かったです。
ただ、以前のmakeは、方言があったので、そっちの方が問題って感じでしたが。

その頃から、こんな本、、とかより、Help(or manページ)を見る事が多い気がします。特に、方言とか、バージョン依存は確認が大変ですね。

と言いつつ、最近は Windows上が多いので、Visual Studio一択の感じ。簡単なものなら、コマンドラインで、、。

あと、ソースコードが複数のディレクトリにまたがった事も考えれた方が良いかと。(数が増えると分けたくなる..)

投稿2019/11/30 00:54

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/30 08:06

pepperleaf様 ご回答誠にありがとうございます。 それとお返事遅れてしまい申し訳ございませんでした。 makeに方言のようなものがある事自体知りませんでしたので 驚きました... yumetodo様や katsuko様のおっしゃると通りCMakeを使うのが得策なのかなと感じました。 ベストアンサーにつきましては様々な方のご回答を拝見してから 決めたいと考えておりますのでもう少し様子を見て決めようと考えております。
guest

0

CLion や VisualStudio 等の統合開発環境は検討されましたか?

VisualStudio は linux 不可、CLion は有料という欠点はありますが…

投稿2019/11/29 17:13

maai

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/29 17:48

maai様 ご回答誠にありがとうございます。 今までIDEを使うとIDEが知らないうちに自動でやってくれる部分を理解しないまま 進んでしまうのではないかと思い怖くて使おうとすらしていませんでした。 しかしIDEの作るディレクトリ構造などを手本にするために使ってみるのもいいかもしれないと maai様の回答を読んで感じました。 あとCLionというIDEは初耳でしたので少し調べてみます。 ベストアンサーにつきましては様々な方のご回答を拝見してから 決めたいと考えておりますのでもう少し様子を見て決めようと考えております。
pepperleaf

2019/11/30 00:57

Visual Studioって Linuxなかったか、と思って検索したら、Visual Studio Codeばかり、あるのは、Mac版でしたか。 もっとも小規模だったら、Visual Studio Codeでも十分な気もしますが、、。
yumetodo

2019/11/30 03:25

Remote DebugでLinuxのプログラムも書けますけどね。
guest

0

なんでもかんでもmodule.hpp/module.cppに突っ込むのではなくて、もっと細分化していくことも検討してもいいかもしれません。

cmakeを使うとmakeの代わりにninjaのような高速なタスク管理を使える利点もあります(もっとも全体のコンパイルが5分超えるような巨大さにならないと実感しないかもですが)

それはそれとして、gccが5.4.0って古いのでは・・・?

投稿2019/11/30 03:28

yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/30 09:30

yumetodo様 ご回答誠にありがとうございます。 もう少しヘッダと実装についてどう構成すべきなのか調べ直しを したほうが良いのかなと感じました。 あとgccのバージョンの御指摘も助かります。 貴重なご意見ありがとうございました。 ベストアンサーにつきましては様々な方のご回答を拝見してから 決めたいと考えておりますのでもう少し様子を見て決めようと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問