0

私の C++ プログラムは、CMake を使用して複数の OS (Win7、MacOS & Linux) 用にコンパイルされています。

OSに依存するものについては、次のようなことをしています:

if (${APPLE})
    // Do MacOS dependent things here
elseif(${WIN32})
    // Do Win dependent things here
elseif(${UNIX})
    // Do Linux dependent things here
endif (${APPLE})

ここで、プログラムを異なるバージョンのライブラリにリンクする必要があります。同じやり方を続けることは、すぐに非現実的になります。

新しい OS やライブラリの新しいバージョンを簡単に追加できるように、すべてを実用的な状態に保ちながら、ライブラリの複数のバージョンに対して複数の OS 用にプログラムをコンパイルするにはどうすればよいでしょうか?

最終的には、すべてが Jenkins に統合されるので、CMake レベルと Jenkins レベル (または両方) のどちらで作業するのがよいかわかりません。

4

1 に答える 1

1

ここにはおそらく「正しい」答えはありません。CMake の目的は、クロスプラットフォームの Make (名前の由来) を提供することであり、プラットフォーム固有のコードを削減または排除する多くの方法を提供します。

プラットフォーム固有のブロックが必要になるケースの大部分は、依存関係の検索中 ( find_libraryfind_fileなど) であるか、コンパイラ/リンカー フラグを設定する場合であることがわかります。(もちろん、私の経験は典型的ではないかもしれませんし、あなたの場合には当てはまらないかもしれません). これは通常、特定の CMakeLists ファイル内に、プラットフォーム固有またはコンパイラ固有のコードが必要な場所があまりないことを意味します。

クリーンアップする 1 つの可能な方法は、すべてのプラットフォーム固有のコードを別々のファイルに入れ、includeそれぞれを 1 つのif elseif elseブロックに入れることです。

于 2013-02-27T01:28:15.623 に答える