2016-05-10 13 views
0

私は実際にライブラリをコーディングしています。私はそれをマルチプラットフォームにしたいと考えています。私はすでにマルチプラットフォームの依存関係を使用しています(主に後押し)。私はCMakeに着手しました。CMakeとVisual Studioの異なるバージョン

私は過去数ヶ月にわたってCLionを使用してきましたが、これは非常に優れたIDEですが、MinGWまたはCygwinが必要なためWindowsで使用するのは非常に複雑です。私はUnixのエミュレーションが私を満足させたので、それまではCygwinを使ってきましたが、最後のアップデート以来、それには全く使えません。

私はVisual Studioに戻ってしまうことを決めました。しかし、それをCMakeと一緒に使う方法は? 私のライブラリはVSの複数のバージョン(VS2013から2015年まで)で展開する必要があります

これまで私が行ってきたことは、ファイルを追加するたびにプロジェクトを再生成していましたが、あなたが推測できるように非生産的です。 コンパイラによっては、別の場所にコンパイルできる必要もあります。たとえば:

  • は、
  • libに
    • VS2013-x64の
      • デバッグ
      • リリース
    • VS2013-x86の
      • デバッグ
      • リリース
    • VS2015-x64の
      • デバッグ
      • リリース
    • VS2015-x86の
      • デバッグ
      • リリース
  • SRC

が可能にCMakeでそれを処理することですか?そしてもしそうなら、どうですか?

答えて

1

これはVisual Studio固有の問題ではありません。

一般に、C++は、あるバージョンのコンパイラでビルドされたライブラリが、同じコンパイラの別のバージョンまたは別のコンパイラでビルドされた実行ファイルで動作することを保証しません。これは、C++がコンパイラにオブジェクトのバイナリレイアウトを生成する方法において一定の自由を与えるためです。

これは非常に古い問題であり、簡単な解決策はありません。ライブラリのインターフェイスに制限を受け入れたくない場合は、サポートされているすべてのコンパイラバージョンのライブラリを再構築する必要があります(通常、コンパイラごとに別々のビルドを意味します)メジャーバージョンバンプコンパイラバージョン)。

CMakeはこれを行うことはできません。各CMakeのconfigure実行は、特定のコンパイラのCMake設定を生成するだけです。ここでできることは、異なるバイナリディレクトリからcmakecmake --buildを繰り返し呼び出すシェルスクリプトを作成し、サポートされているすべてのコンパイラを自動的にビルドすることです。これは手作業ではまだ手間がかかりますので、それを支援するために継続的な統合システムを設定することをお勧めします。

代替方法は、バイナリインターフェイスが適切に定義されるようにライブラリインターフェイスを制限することです。通常、これは2つのうちの1つを意味します。

  • 外部ライブラリインターフェイスとしてC APIを使用します。あなたのコードはC++でも構いませんが、あなたのライブラリと対話したいアプリケーションはC APIを経由しなければなりません。ここでの明らかな欠点は、インタフェースにクラスがなく、構造体とフリー関数があることです。この解決策はあなたが考えるよりも一般的です。 Steppanus Du ToitはCppCon 2014でこのアプローチについて話をしました(video; slides)。
  • Microsoft's COMのようなオブジェクトモデルテクノロジーを使用します。標準化されたABIの欠如は今や人々を悩ませており、業界はクラスとオブジェクトをインターフェース上でどうやって得るかに関するいくつかの解決策を思いついた。残念ながら、これらの技術を理解することは決して簡単なことではありません。このアプローチは、Windowsの世界では非常に一般的です。
0

あなたがいる限り、たとえば、cmakeのを実行しているときにそれを指定するとVSのプロジェクトファイルの異なるバージョンを生成することができます。

cmake -G "Visual Studio 14 2015 Win64" .. 

または

cmake -G "Visual Studio 12 2013 Win64" .. 
あなただけの正しい発電機を使用する必要があります

各バージョンの名前。

ファイルを追加するたびに再生成については、無意識のうちにこれを避けてください。あなたが好きなだけ作業している間は、単にビジュアルスタジオのプロジェクトに追加することはできますか?ちなみに、再生成時にすべてのビルド成果物を削除する必要はありません。そのため、ファイルをディレクトリに追加するときにコマンドを実行するのは簡単で、プロジェクトはVisual Studioで自動的に更新されます。 VSにguiを追加するのに比べると、慣れていても、それほど大きな問題ではありません。

編集: Debug vs Releaseはジェネレータの一部ではありません。あなたは通常どおりにビジュアルスタジオで設定することができます。

関連する問題