質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.37%

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 581

diode

score 157

前提

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

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

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

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

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

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

.
├── bin
│   └── a.out 
├── include
│   ├── main.hpp 
│   └── module.hpp
├── makefile
├── obj
│   ├── main.d
│   ├── main.o
│   ├── module.d
│   └── module.o
└── src
    ├── main.cpp
    └── module.cpp

備考1:main.hppとmain.cppはmain関数を含む処理の主軸となるファイルである。
備考2:module.hppとmodule.cppは自作のライブラリを記載したファイルである。

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

COMPILER  = g++
CFLAGS    = -g -MMD -MP -Wall -Wextra 

INCLUDE   = -I./include 
TARGET    = ./bin/a.out
SRCDIR    = ./src

SOURCES   = $(wildcard $(SRCDIR)/*.cpp)
OBJDIR    = ./obj

OBJECTS   = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o)))
DEPENDS   = $(OBJECTS:.o=.d)

$(TARGET): $(OBJECTS) 
    $(COMPILER) -o $@ $^ $(LDFLAGS)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    -mkdir -p $(OBJDIR)
    $(COMPILER) $(CFLAGS) $(INCLUDE) -o $@ -c $<

all: clean $(TARGET)

clean:
    -rm -f $(OBJECTS) $(DEPENDS) $(TARGET)

-include $(DEPENDS)

補足情報(FW/ツールのバージョンなど)

os: LinuxMint18.2(Cinamon)
コンパイラ: g++ 5.4.0
make: GNU Make 4.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+3

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/30 05:06 編集

    katsuko様
    ご回答誠にありがとうございます。

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

    ベストアンサーにつきましては様々な方のご回答を拝見してから
    決めたいと考えておりますのでもう少し様子を見て決めようと考えております。

    キャンセル

checkベストアンサー

+2

こんにちは。

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

しかしgithubなどで様々なプロジェクトを眺めてみるとこの作業方法をとってる
プロジェクトを見た事がありません。

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/30 17:39

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

    キャンセル

  • 2019/11/30 18:12

    Chironian様
    ご回答誠にありがとうございます。

    includeフォルダとsrcフォルダをわけないほうが良い。
    や記事の紹介などの
    具体的なアドバイス大変ありがとうございます。
    じっくり紹介していただいた記事を読んで考えてみます。

    ベストアンサーにつきましては様々な方のご回答を拝見してから
    決めたいと考えておりますのでもう少し様子を見て決めようと考えております。

    キャンセル

+2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/30 02:48

    maai様
    ご回答誠にありがとうございます。
    今までIDEを使うとIDEが知らないうちに自動でやってくれる部分を理解しないまま
    進んでしまうのではないかと思い怖くて使おうとすらしていませんでした。
    しかしIDEの作るディレクトリ構造などを手本にするために使ってみるのもいいかもしれないと
    maai様の回答を読んで感じました。

    あとCLionというIDEは初耳でしたので少し調べてみます。

    ベストアンサーにつきましては様々な方のご回答を拝見してから
    決めたいと考えておりますのでもう少し様子を見て決めようと考えております。

    キャンセル

  • 2019/11/30 09:57

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

    キャンセル

  • 2019/11/30 12:25

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

    キャンセル

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/30 17:06

    pepperleaf様
    ご回答誠にありがとうございます。
    それとお返事遅れてしまい申し訳ございませんでした。

    makeに方言のようなものがある事自体知りませんでしたので
    驚きました...
    yumetodo様や
    katsuko様のおっしゃると通りCMakeを使うのが得策なのかなと感じました。

    ベストアンサーにつきましては様々な方のご回答を拝見してから
    決めたいと考えておりますのでもう少し様子を見て決めようと考えております。

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/30 18:30

    yumetodo様
    ご回答誠にありがとうございます。

    もう少しヘッダと実装についてどう構成すべきなのか調べ直しを
    したほうが良いのかなと感じました。
    あとgccのバージョンの御指摘も助かります。
    貴重なご意見ありがとうございました。

    ベストアンサーにつきましては様々な方のご回答を拝見してから
    決めたいと考えておりますのでもう少し様子を見て決めようと考えております。

    キャンセル

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る