5

tl;dr質問は一番下にあります。

私は何か新しいことを試みている開発者です-私の最後の毒はc++です。私は自分の時間の半分をLinuxラップトップに費やし、残りの半分をWin XP PCに費やしているので、優れたc ++プラクティスを使用して、基本的なベアボーンプロジェクトを作成する方法を見つけようとしました(経験からはわかりませんが、私はそれらについて読んだだけです)。現在、私のプロジェクトcmake . && makeはLinuxで使用している間はほとんど機能します(ヘッダーファイルとソースファイルが同じフォルダーにある場合は機能しますが、/ srcフォルダーを含めるように分離すると失敗します)。私はWindowsでnuwenのmingwのディストリビューションを使用しています(ツールチェーンが機能していることはわかっています。Eclipse内から問題なくプロジェクトをコンパイルします)。

私のプロジェクトディレクトリは次のようになります。

engine 
    |
    |- main
         |
         |- include
                 |
                 |- App.h  
                 |- CMakeLists.txt (2)
         |- src
             |
             |- main.cc
             |- App.cc
             |- CMakeLists.txt (3)

    |- CMakLists.txt (1)

ファイルの内容は非常に単純です(わかりやすくするためにインクルードガードなどを削除します)

App.h:

class App {
   public:
      App();
      int onExecute();
};

App.cc:

#include <iostream>
#include "App.h"

App::App() {
}

int App::onExecute() {
   std::cout << "inside app.." << '\n';
   return 0;
}

main.cc:

#include <iostream>
#include "App.h"

using namespace std;

int main(int argc, char* argv[]) {
  App a;

  a.onExecute();
  std::cout << "inside main.." << '\n';
}

CMakeLists.txt(1)-メインのもの:

cmake_minimum_required (VERSION 2.6)
set (CMAKE_CXX_COMPILER "g++")

project (gameengine)

add_definitions ( "-Wall -ansi -pedantic")

add_subdirectory (${CMAKE_SOURCE_DIR}/main/include)
add_subdirectory (${CMAKE_SOURCE_DIR}/main/src)

add_executable (engine ${CMAKE_SOURCE_DIR}/main/src/main.cc)
target_link_libraries (engine Application)

CMakeLists.txt(2)-インクルードディレクトリ内

add_library (Application App)
set_target_properties (Application PROPERTIES LINKER_LANGUAGE CXX)

CMakeLists.txt(3)-srcディレクトリ内

include_directories (../include)

そして、これは私が得た限りです-いくつかの変更(つまり、App.ccをincludeディレクトリに移動する)で、すべてがLinuxで正常にコンパイルおよび実行されます-しかし、mingwジェネレーターをWinXPで動作させることができません。適切なmake.exeを指すようにファイルCMakeCache.txtのCMAKE_MAKE_PROGRAMを手動で調整しました(これはシステム変数として定義する必要があることはわかっていますが、さまざまなPCで作業しているため、後でジャンクを残したくありません自分)。

私の質問は次のとおりです。

1)マルチプラットフォームのCMakeLists.txtファイル(OSとプロジェクトファイルの場所に関係なく機能します)を作成するためのガイドラインは何ですか?これにより、プロジェクト構成を一方のOSからもう一方のOSに簡単に切り替えることができますか?

2)ヘッダーファイルが見つからないというエラーに対処するにはどうすればよいですか(make give:(...)\ engine \ main \ src \ main.cc:2:17:致命的なエラー:App.h:そのようなファイルまたはディレクトリはありません)?

お手数をおかけしますが、よろしくお願いいたします。

4

2 に答える 2

7

1)マルチプラットフォームのCMakeLists.txtファイル(OSとプロジェクトファイルの場所に関係なく機能します)を作成するためのガイドラインは何ですか?これにより、プロジェクト構成を一方のOSからもう一方のOSに簡単に切り替えることができますか?

まあ、私は確かに専門家ではありませんが、クロスプラットフォームのcmakeベースのプロジェクトで10か月の経験を共有することができます。

すぐに、ソース外のビルドを使用する必要があると思います。これは、コードと同じディレクトリでcmakeを実行しないことを意味します。代わりに、新しいフォルダを作成し、そこからengine/build実行cmake ../mainします。このようにして、CMakeCache.txtなどのcmakeのものでソースファイルを壊さないようにします。ユーザーがソース内ビルドを実行することを禁止するために使用できるマクロもいくつかあります。

また、さまざまなプラットフォームのコンパイラオプションを設定するのに役立つマクロファイルのセットを作成すると便利です。ここでは、ADD_GCC_FLAGまたはなどのマクロがADD_MSVC_FLAGあり、現在のコンパイラをチェックし、それに応じてフラグを追加します。

.cmakeすべてのプロジェクト構成を1か所に集中させる単一のファイルを用意することをお勧めします。仕事で私たちのすべてのCMakeLists.txtスタートはinclude( ../cmake/configs.cmake )。このファイルは、標準のインクルードディレクトリ、デフォルトのコンパイラフラグなど、あらゆる種類のオプションを設定します。

インクルードディレクトリの問題を解決するには、ソースファイルで相対パスではなく絶対パスを使用することをお勧めします。たとえば、標準のインクルードディレクトリを定義し、engine/main/include常に#includeそのパスに関連するファイルを定義します。あなたの例ではengine/main/include/somefolder/header.h、を含めたい場合は、次のように記述します#include <somefolder/header.h>(引用符の代わりに使用<>すると、ファイルを探すときに現在のディレクトリをスキップするようにC ++プリプロセッサに指示します)。


2)ヘッダーファイルが見つからないというエラーに対処するにはどうすればよいですか(make give:(...)\ engine \ main \ src \ main.cc:2:17:致命的なエラー:App.h:そのようなファイルまたはディレクトリはありません)?

cmakeのレイアウトには多くの問題がありますが、そのエラーが発生した理由は、同様に呼び出す必要があるためinclude_directoriesですCMakeLists.txt (1)

それに加えて、他のCMakeLists.txtファイルにも問題があります。ではCMakeLists.txt (2)、の引数add_libraryが間違っています。そうでなけれ../src/App.ccば、空のライブラリを追加するだけです。set_target_propertiesそして、少なくともadd_library議論が正しければ、それも必要ありません。ライブラリを追加するのinclude_directoryと同じ呼び出しも必要です。CMakeLists.txtそれを入れて(3)も実際には何もしません。

実際には、ディレクトリにビルドするものがないためCMakeLists.txt、ディレクトリにファイルは必要ありません。を呼び出した直後に、を呼び出すことをincludeお勧めします。add_libraryCMakeLists.txt (3)include_directories

これがあなたの疑問のいくつかをクリアすることを願っています。

于 2010-11-03T11:45:19.990 に答える
0

これはおそらくあなたが期待する答えではありませんが、あなたは代替の解決策が欲しいかどうかを述べていなかったので、とにかくそれを提案します:

マルチプラットフォームプロジェクトの場合SConstruct、これは本当に優れた柔軟なツールであることをお勧めします。私はCMakeをよく知らないので、詳細な比較を行うことができます。

ただし、このツールが気に入った理由は次のとおりです。

  • Pythonです。したがって、カスタマイズや特別なニーズに関して、ほとんど何でもできます。
  • 学ぶのは本当に簡単で、単純なプロジェクトの場合、開始するのに数行のコードしか必要ありません。
  • Pythonのみに依存しているため、Linuxではすでにインストールされていることが多く、Windowsではダウンロードとインストールに5分かかります。
  • 非常に優れた自動依存関係ツリーの生成と並列コンパイルのサポートがあります。
于 2010-11-03T08:16:19.703 に答える