現在C/C++(VisualStudio2008 academic edition)でライブラリのようなものを作成しているのですが悩んでいることがあるので相談させてください。
ライブラリの実装として、
・ネットワーク
・ファイル入出力
・描画系
・オーディオ再生
・数学系
・アルゴリズム
・シーングラフ管理システム
・メモリ管理システム
・デバッグシステム&プロファイラー
のようなものを1つのプロジェクトで管理しています。
しかし、いろいろあってファイル入出力のシステムだけ使おうとしても1つのプロジェクトに描画やらネットワークやらいらないシステムも芋づる式にくっついてきてしまいます。
「そういうふうに作ったんだから当たり前だ」と言われてしまえばそれまでなのですが、普通はこのようないろんなシステムが入ってくる場合、どのようにプロジェクトを管理するのが適切でしょうか?
私なりにいくつか考えたものでは
1:現状のまま使っていき不要なライブラリがあるのも承知でそのまま利用する
2:1つ1つのシステムごとにプロジェクトをわけてパスを通して別プロジェクトだが1つのシステムのように扱う(当然共有すべきヘッダーやクラスが出てきたりするし、ライブラリファイル(.lib)やDLLがたくさんできあがる)
3:1つ1つまったく別プロジェクト、別ソリューションとして作成し、共有するヘッダーを作らないようにする(同じことが書いてあるヘッダーが各ソリューションのフォルダに入ったりすることもある(当然1つを変えるとすべてを手作業で編集する作業が必要になる))
以上です。
3番目以外は試してみたのですが、
1番は、いらないシステムまでくっついてくる(1つのシステムを利用するのにヘッダーの管理がべらぼうに大変)
2番は、パスの通っているプロジェクトから通っていないプロジェクトへの管理が大変
(たとえばプロジェクトがA,B,CとあったとしてBはAのプロジェクトにパスが通っていてヘッダーをincludeしていると仮定する、CはBのプロジェクトにパスが通っているとする。この時、CがBのプロジェクト内のヘッダーをincludeするとCからAに対してパスが通っていないためコンパイルエラーとなる)
表現方法があいまいで伝わらない個所もあるかもしれませんが、これ以外に適切な管理方法や、こんな方法でやると便利などといった情報があれば教えてください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>「そういうふうに作ったんだから当たり前だ」と言われてしまえばそれまでなのですが、普通はこのようないろんなシステムが入ってくる場合、どのようにプロジェクトを管理するのが適切でしょうか?
芋づる式に色々ついてくるライブラリーは実際結構あります。
名前はいえませんが、有名なエンジンもそうだったりします。なので何でもライブラリというもの有りだとは思います。
少し話がそれますが大規模なものだと問題になってくるのがリンク速度です。libファイルが巨大になると、とにかくリンクに時間がかかります。
たかがcppファイルを1行変えただけなのにリンクに5分待たされるとか、たまらないです。(トライ&エラーの効率が悪いです)
たとえばデバッグ版はdll、リリース版はlibで動くとかの工夫をしておくと後で幸せになれると思います。
>・ネットワーク
>・ファイル入出力
>・描画系
>・オーディオ再生
>・数学系
>・アルゴリズム
>・シーングラフ管理システム
>・メモリ管理システム
>・デバッグシステム&プロファイラー
・デバッグシステム&プロファイラー
・メモリ管理システム
・ファイル入出力
・数学系
・アルゴリズム
まずこの5つはどんなアプリだろうがほぼ必要になります。これはひと括りにまとめてよいと思います。
「基本ライブラリ」とでも呼びましょう。※後書いてないですがスレッド管理とかも
・描画系
・オーディオ再生
これはそれぞれ分離することができると思います。ただし下位レイヤーに「基本ライブラリ」は必要です。
(ゲームがターゲットなライブラリなので描画系とオーディオ再生は一緒にしてもよいかとは思います。好みの問題。)
・シーングラフ管理システム
シーングラフ管理システムが何をするかよくわかりませんが、
名前からだとアプリケーションのレイヤーだと思います。(描画系と基本ライブラリに依存)
※もし描画エンジンに特化したものであれば描画エンジンにいれる
とりあえず上記4つ(基本、サウンド、描画、グラフ)若しくは3つ(基本、サウンド/描画、グラフ)にプロジェクトをわけてみてはどうでしょうか。
>3:1つ1つまったく別プロジェクト、別ソリューションとして作成し、共有するヘッダーを作らないようにする(同じことが書いてあるヘッダーが各ソリューションのフォルダに入ったりすることもある(当然1つを変えるとすべてを手作業で編集する作業が必要になる))
これは無いかと思います。
includeパスの設定を各プロジェクトで行いヘッダは共有するのが普通かと思います。
No.2
- 回答日時:
No.1です。
すいません。「ネットワーク」が抜けていました。
「ネットワーク」を「基本ライブラリ」と分離するべきかどうかは難しいですね。
結局、ライブラリを細分化しても単体で使うことがないのならば意味がありません。
例えば描画を必要としないゲームのサーバーを作る場合、
「基本ライブラリ」+「ネットワークライブラリ」で構成できます。
ゲームのクライアント側は
「基本ライブラリ」+「ネットワークライブラリ」+ 「描画/サウンドライブラリ」
が必要ですが、
どちらにしても「ネットワークライブラリ」は必要になるので
「ネットワークライブラリ」は「基本ライブラリ」に含めてしまって良いと考えることができます。
ただしオフゲーを作る場合は「ネットワークライブラリ」は余分なものになりえます。
そこを許容するかどうか、あるいは許容できるかどうかは
それぞれの事情に依ります。
例えばコードサイズを極力小さくする必要があるのなら分けた方が良いです。
※リンカで最適化される場合もありますが、期待できない場合もあります。
最初にも言いましたが何でもライブラリというのも有りです。
>(たとえばプロジェクトがA,B,Cとあったとして
>BはAのプロジェクトにパスが通っていてヘッダーをincludeしていると仮定する、
>CはBのプロジェクトにパスが通っているとする。
>この時、CがBのプロジェクト内のヘッダーをincludeするとCからAに対してパスが通っていないためコンパイルエラーとなる)
2番を実践されているようですが、少し気になったので補足します。
基本的にはプロジェクトにincludeパスを設定します。
例えばorelib(俺ライブラリ)というライブラリを作ったしたなら
どのプロジェクトのソースからも
#include <orelib/network.h>
#include <orelib/sound.h>
でコンパイルエラーにならないようプロジェクトにパスを設定してください。
boostを入れたことはないでしょうか?
例えばboostで正規表現を使いたい場合は
#include <boost/regex.hpp>
とヘッダをincludeします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Visual StudioでDjangoのプロジェクト配下のappを作成する方法 1 2022/05/01 03:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 2 2022/11/18 15:34
- 転職 施工管理の転職について 質問内容 求人に、正社員とはっきり明記している施工管理の求人について。 おお 1 2023/01/01 07:24
- IT・エンジニアリング 企業におけるデータ管理方法についてみなさまのお考えを教えてください。 1 2023/04/15 22:34
- その他(コンピューター・テクノロジー) FPGA構成データ、ソフトウェアデータ をボード Zybo Z20 用に転送する方法 1 2023/07/25 18:19
- 画像編集・動画編集・音楽編集 AfterEffectでのシャターの挙動がおかしい 1 2023/05/07 00:38
- その他(プログラミング・Web制作) Gitlabで既存のプロジェクト(ソース)をコピーした別名プロジェクトの作り方を教えてください 1 2022/05/31 16:01
- 会社・職場 会社のことで悩んでいます。 5 2022/11/18 22:33
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MP3の再生
-
VC++6.0からVC++.NET2005へ移植
-
fatal error LNK1104: ファイル...
-
DSOUND.LIBが見つかりませんっ...
-
スタティックライブラリ関係の...
-
ライブラリファイルのリンク ...
-
operator new が再定義されてい...
-
error LNK2019: 未解決の外部シ...
-
Makefileと共有ライブラリ
-
MinGWでOpenMPを使いたいのです...
-
スタティックリンクライブラリ...
-
eclipse+MinGWの環境で外部ライ...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
VBAを何回も作り直して、容量が...
-
C2146を回避するにはどうしたら...
-
unsigned long long 型のフォー...
-
C言語の規格
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリ関係の...
-
fatal error LNK1104: ファイル...
-
【VS2008 C++】2つのプロジェ...
-
C++Builder リンカエラーとは?
-
スタティックリンクライブラリ...
-
visual studio community2017 O...
-
静的/動的リンクライブラリにつ...
-
VC++6.0からVC++.NET2005へ移植
-
VC++でビルド時の、リンク警告 ...
-
error LNK2019: 未解決の外部シ...
-
dllかlibか
-
#pragma commentの相対パス指定
-
VS2010にて、依存関係とビルド順
-
'stdafx.h'のエラーに関して
-
WindowsにおけるPostgreSQL+C言...
-
'd3dx9.lib' が開けません。
-
eclipse+MinGWの環境で外部ライ...
-
lvwReport/エラー/プロジェクト...
-
#include <winreg.h>をインクル...
-
operator new が再定義されてい...
おすすめ情報