CMake生成VS 2012 ARMプロジェクトで発生した問題
3869 ワード
VS 2012は現在比較的新しく、最新バージョンのcmake 2.8.10.1)は現在wp 8のSDKをサポートしていないので、win 8でarmプロジェクトを生成した後、cmakeは通過できません.具体的な操作は以下の通りです.
呼び出しコマンド生成vs 11のプロジェクト
主な問題は、コンパイラを検出して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を生成する主要クラスであり、修正後のコードは以下の通りである.
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に追加されます.
対応するコードは以下の通りです.
修正後cmakeを再コンパイルしてVisual Studio 11 ARMのエンジニアリングファイルを生成するとスムーズに完了します.Windowsの普及に伴い、すぐに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開発者がこの問題に気づき、徐々に修正していくと信じています.