1

ライブラリを整理する方法が、ライブラリを整理するための最もエレガントな方法かどうかはわかりません。私は主に、入力したすべてのコードを、ターゲットにしているすべてのシステムでコンパイル/実行し(移植性を維持し)、すべてのシステムで最新の状態に保つことに関心があります。

例:MacまたはLinuxで__declspec(dllexport / dllimport)を使用するかどうかはわかりません。そうではないと思いますが、Mac/Linuxに相当するものが何であるかはわかりません。または、別の例として、特定のオペレーティングシステム関数を呼び出す場合がありますが、これは避けようとしています。ただし、次のようなことは、何かが発生するのにかかる時間を正確に測定すること*であり、OS固有の関数を呼び出す必要があります。

*ユーザーの時間を正確に取得する場合と同様(マイクロ/ミリ秒まで)。

私が現在(おそらく将来的に)目指しているシステムは、Mac、Windows、Linuxです。しかし、コードがすべてのシステムでコンパイルされる(そして正しく実行される)ことをテストすることは、時間の無駄のように思えます。現在のように、私が提案している方法では、システムごとに個別のプロジェクトを作成する必要があります。つまり、Windows用のVisual Studioプロジェクト、Mac用のXcodeプロジェクトを作成し、Linux用のコマンドラインを使用するか、他のIDEを使用します。

さて、私が物事を整理する方法に関する私の主な問題は次のとおり
です。1.すべてのシステムのプロジェクトを作成し、各システムの各プロジェクトを最新の状態に保つ場合のように、時間の消費。
2.使用する必要のあるすべてのIDE/コンパイラに関する知識

注意してください、私はこれまでLinuxを実際に使用したことがありません。切り替えを考えています。私が懸念している唯一の問題は、それを使用するための適切なツールを見つけ、必要なものに適した適切なDistroを見つけることです。Linuxの経験者が私を導いてくれたり、切り替えるかどうかアドバイスをくれたら本当にありがたいです。

私はVisualStudioが本当に好きで、それはかなり前から私のメインIDEでした。Linuxの場合、VisualStudioを廃止するかどうかはわかりません。Linuxで利用できるツールが、VisualStudioでできることを実行できるかどうかはわかりません。つまり、VisualStudioと同じくらいユーザーフレンドリーです。Linuxのツールの使い方を学ぶのが怖いのですが、そうする価値があるかどうかはわかりません。時間はこのライブラリの主要な要素ではありません。私には十分な時間があります。私はかなり若く、将来のキャリアとしてプログラムすることを決意しています。

*以前に使用したことがありますが、Windows用に交換したことはありません。

現在、プロジェクトのすべてのソースコードをBitBucketでホストしていますが、現時点では、リポジトリにRAWコードしかありません。プロジェクトファイルやそれをコンパイルするための他のツールはなく、コードとreadmeファイルだけです。Makefilesは人気があるように見えるので、使用することを考えていました。しかし、私はこれまでMakefileを作成したことがありません。誤解しないでください、私は喜んで学びます。どこから始めればいいのかよくわかりません。人々はCMakeを使用してSFMLやOgre3Dなどのポータブルライブラリを作成していると聞きました。私はCMakeを使用していくつかのライブラリを構築しましたが、プロジェクト/ファイルを作成するために実際にそれを使用して独自のライブラリを作成する方法がわかりません。CMakeを学習してライブラリに組み込む必要がありますか、それともより良いオプションがありますか?

編集:

GUIを使用する実際のソフトウェア用のライブラリを作成することは目的としていません。私は主にゲームを書くことを目的としています。

4

3 に答える 3

3

1-ブースト。Boostは、想像以上に携帯性を向上させます。その唯一の本当のこだわりは、信じられないかもしれませんが、OSXです。

2-CMakeを使用します。ビルドツールとしてVisualStudioプロジェクトファイルと統合され、さまざまなプラットフォームのコンパイルブードゥーのほとんどをそこに配置できます。

3-ポータブルライブラリを真剣に作成している場合は、Cで作成するか、Cラッパーを作成するか、ヘッダーのみにするか、ソースコードを提供することを検討してください。共有または静的にリンク可能なライブラリにすることは、それがうまく機能することを意味するわけではありません。名前のマングリングは、あなたの心を吹き飛ばす矛盾につながります。

4-各変数のビット数について常に明示します。

5-gitを使用します。これにより、リポジトリ用の安っぽいローカルサーバーを非常に簡単にセットアップし、MSVCが煩わしく行うような大きな変更を非常に高速に転送できるようになります。

クロスプラットフォーム開発について議論できるベストプラクティスは他にもたくさんあります。そのアドバイスのすべてがすべての場合に当てはまるわけではありません。私は非常にコードが多いLinux/Windowsライブラリを持っており、ほとんどがMSVC2k10でコーディングし、ほとんどがLinuxでビルド/テストを行っていますが、ヘッダーのみにはほど遠いです。

コメントに応じて編集:

ローカルでの使用と管理が非常に簡単であることがわかったため、gitが提案されました。私は以前にsvnを使用したことがあり、それが好きでした。他の人を本当に支持することはありませんが、おそらくすばらしいものがたくさんあります。

ポイント3について詳しく説明すると、ACラッパーを使用すると、FORTRAN開発者、Ruby、さらにはJavaなど、どこでも誰でもライブラリを使用できるようになります。それ以外の場合は、通常、適切にリンクするために同様のコンパイラバージョンが必要であり、DLLの場合を除いて、他のC ++コードにのみリンクし、バージョン管理の問題があります。これは、C ++で残された最も愚かな問題の1つです。ウィキペディアで、「名前マングリング」を確認してください。広く使用されているライブラリがCで記述されているか、libz、opensslなどのCラッパーを使用しているのには理由があります。

それには他にも利点があります。ダイナミックライブラリ間での例外の伝播は存在しません。静的ライブラリでは、一貫性がないか、存在しない可能性があります。

最も広く使用されているC++ライブラリは、Boostのように、ほとんどがヘッダーのみであることがわかります。ヘッダーのみのライブラリは、すべてのコードを比較的直感的な方法でプロジェクトに直接配置することで多くの問題を解決します。最新のコンパイラは、それに関連する余分なコンパイル時間の多く(すべてではありません)を最適化できます。

とはいえ、Cラッパーやヘッダーなしで実行することは確かに可能です-それは単に面倒で非常に面倒です。DLL地獄とそれに相当するLinuxはまだ存在しています。

Boostについても質問されました。場合によります。ソースコードを配布している場合は、確かにコードと一緒にBoostを配布するか、人々にインストールしてもらう必要があります。他のライブラリをコンパイルしたり、プログラムを使用したりするために、人々にライブラリをインストールしてもらうのが一般的な方法です。たとえば、DirectXの特定のバージョンにゲームがどのように付属しているかを考えてみてください。

ただし、ライブラリのバイナリバージョンを配布している場合、Boostに対して静的にリンクすると、Boostヘッダーをライブラリの外向きの部分に入れないように注意する限り、Boostを含める必要がなくなります。これは、C++ヘッダー内のvoid*ポインターのようなものを見始めるところです。残念ながら、C++コンパイルとライブラリ配布のいくつかの欠点の不幸な副作用。

于 2012-07-23T11:53:02.413 に答える
1

個人的には、Qtのようなフレームワークを利用します。これは、非常に移植性が高く、多くのOS機能(ファイル、タイミング、スレッド、ネットワーク)を抽象化し、移植性のあるまともな無料のIDE(Qt Creator)を入手できるためです。 Windows、OS X、およびQtを実行するすべてのUnixフレーバーで実行されます。それはあなたに参入障壁を最も低くするでしょう。Qt Creatorは、VisualStudioコンパイラとCDBデバッガーが利用可能な場合はそれらを活用できます。

Qtを使用するためにOpenGLを使用する必要はありません。実際、特定のグラフィックサブシステムにバインドされていませんQtは、QtQuick2グラフィックスバックエンドにQt5のOpenGLのみを「使用」します。Qt4にもQtQuick1にも必要ありません(Qt 5でも!)。

任意の2Dまたは3Dフレームワークを使用して、画像やその他のコンテンツを画面にプッシュできます。Qtが得意とするのは、ゲームでよく必要とされる種類の2D画像(メニュー、構成画面、HUDなど)を作成することです。Qtが目的に簡単に活用できるコントロールや描画プリミティブがたくさんあります。

Qtでは、適度に強力なモデルビューおよびネットワークフレームワークを使用することもできるため、リアルタイムで更新されるサーバーまたはクライアントのリストを適度に簡単に生成できます。

もちろん、QtとDirectXの間に少量のシムコードが必要です。出力側では、通常QImage、Qtで終了し、DirectX、SDL、OpenGLなどを使用して画面にプッシュします。入力側では、メインのゲームループ内で呼び出す必要qApp->processEvents()があり、DirectXなどからのユーザー入力イベントをを使用してQtのイベントキューに投稿する必要がありますqApp->postEvent(...)。これは、たとえば、DirectXメインループがすべてのWindowsメッセージを消費し、標準のwinapi / win32コード(QtのWindowsイベントディスパッチャー)にそれらを表示させない場合にのみ必要になります。私はDirectXをあまり扱っていないので、もちろん他の人も気軽に詳細を教えてくれます。

于 2012-07-23T11:59:28.297 に答える
1

CMakeは良い選択です。あなたはそれを使うことを学ぶことができます。チュートリアルを読む:
http ://www.cmake.org/cmake/help/cmake_tutorial.html

ただし、ターゲットがLinuxとWindowsのみの場合。あなたの場合(小規模/平均的な最初のマルチプラットフォームプロジェクト)、2つの別々のビルドシステムを維持することはおそらくOKです。

  • Linuxでは、Makeを使用します。これは標準であり、非常に優れたリファレンスマニュアルがあります:
    http ://www.gnu.org/software/make/manual/make.html

  • Windowsの場合。Visual、DevC ++、その他のIDEプロジェクトファイルを使用します。それが最も簡単な方法です。

最も重要なのは、さまざまなプラットフォームでライブラリ/ソフトウェアを簡単にテストできるようにすることです。デスクトップに仮想マシンをインストールします。または、少なくともライブラリをCygwinにコンパイルします。

あなたがここに来たら、stackoverflowに戻ってきてください、そして私たちは助けます!

于 2012-07-23T12:05:38.077 に答える