CMake生成VS 2012 ARMプロジェクトで発生した問題

3869 ワード

VS 2012は現在比較的新しく、最新バージョンのcmake 2.8.10.1)は現在wp 8のSDKをサポートしていないので、win 8でarmプロジェクトを生成した後、cmakeは通過できません.具体的な操作は以下の通りです.
呼び出しコマンド生成vs 11のプロジェクト
cmake -G"Visual Studio 11 ARM" .
で次の問題が発生しました.
1>C:\Program Files
(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Platforms\ARM\PlatformToolsets\v110\Microsoft.Cpp.ARM.v110.targets(36,5):
error MSB8022: Compiling Desktop applications for the ARM platform is not
supported.

==========   :    0  ,   1  ,   0  ,   0   ==========

主な問題は、コンパイラを検出してtrycompileを実行することです.次にtrycompileデバッグスイッチをオンにして、いったいどういうことなのか見てみましょう.実行が完了したらbuildディレクトリの下にあるCMakeFilesCMakeTmpディレクトリに行ってCMAKE_を開くTRY_COMPILE.slnエンジニアリングファイルを手作業でコンパイルしてみましょう.問題はやはり命令と同じだ.やっと問題が見つかった.
もともとvsprojectには、コンパイラと関係のあるアイテム設定(PlatformToolset)がありました.cmakeのデフォルト生成の指向はv 110である.v 110_に変更する必要がありますwp 80はARMバージョンをコンパイルすることができます.
またwp 8に変更する後もコンパイルはヒントなしでkernel 32に接続できない.lib(これは不明ですね.wp 8は接続できないに違いありません.きっとcmakeがプロジェクトを作成するときにwpの問題を考えていないに違いありません)
1>LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
次に、この2つの問題を修正し、cmakeソースコードを抜きます.
具体的な変更は以下の通りです.
cmGlobalVisualStudio10Generator.cxxはplatform toolsetを生成する主要クラスであり、修正後のコードは以下の通りである.
void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
{
    ...
     if(const char* toolset = gg->GetPlatformToolset())	//  GetPlatformToolset  project  
	{
		//get arch info
		if ( strstr(this->Platform.c_str(), "ARM") )
		{
			toolset = "v110_wp80";	//    ARM     v110_wp8,    hardcode,     SDK         winphone sdk   ,
						//   cmake        。      this->Makefile->AddDefinition(); this->Makefile->GetDefinition();
		}
		std::string pts = "";
		pts += toolset;
		pts += "
"; this->WriteString(pts.c_str(), 2); } }

link flagsを修正関連kernel 32を削除する.lib
このlink flagsはどこで入れたのですか?
cmake-2.8.10.1\Modules\Platform\Windows-MSVC.cmake
cmake-2.8.10.1\Modules\Platform\Windows-Intel.cmake
この2つのmoduleに追加されました
 set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
CMAKE_C_STANDARD_LIBRARIESはコードで呼び出され、標準リンクライブラリとして各プロジェクトのAdditionalDependenciesに追加されます.
対応するコードは以下の通りです.
void cmVisualStudio10TargetGenerator::WriteLinkOptions(std::string const&
                                                       config)
{

  ...
  std::string standardLibsVar = "CMAKE_";
  standardLibsVar += linkLanguage;
  standardLibsVar += "_STANDARD_LIBRARIES";
  std::string
    libs = this->Makefile->GetSafeDefinition(standardLibsVar.c_str());  //    CMAKE_C_STANDARD_LIBRARIES
  // Remove trailing spaces from libs
  std::string::size_type pos = libs.size()-1;
  if(libs.size() != 0)
    {
    while(libs[pos] == ' ')
      {
      pos--;
      }
    }
  if(pos != libs.size()-1)
    {
    libs = libs.substr(0, pos+1);
    }
  // Replace spaces in libs with ;
  cmSystemTools::ReplaceString(libs, " ", ";");
  cmComputeLinkInformation* pcli =
    this->GeneratorTarget->GetLinkInformation(config.c_str());
  if(!pcli)
    {
    cmSystemTools::Error
      ("CMake can not compute cmComputeLinkInformation for target:",
       this->Name.c_str());
    return;
    }
  // add the libraries for the target to libs string
  cmComputeLinkInformation& cli = *pcli;
  if ( strstr(this->Platform.c_str(), "ARM") == 0 ) //        ,   ARM    link 
  {
	  this->AddLibraries(cli, libs);
	  linkOptions.AddFlag("AdditionalDependencies", libs.c_str());
  }
  ...
}

修正後cmakeを再コンパイルしてVisual Studio 11 ARMのエンジニアリングファイルを生成するとスムーズに完了します.Windowsの普及に伴い、すぐにCMake開発者がこの問題に気づき、徐々に修正していくと信じています.