2011-11-08 12 views
4

デバッグモードがコンソールアプリケーションで、リリースモードがWin32アプリケーションであるようにアプリケーションを構築したいとします。 documentationによると、コンソールアプリケーションを使用するかどうかによって、WIN32add_executableに追加する必要があります。CMake:デバッグビルドに別のADD_EXECUTABLEを使用するには?

私はVisual Studioを使用しているため、CMAKE_BUILD_TYPEを使用できません(生成されたプロジェクトには複数の設定が含まれています)。リリースビルドにWIN32を使用し、デバッグビルド用に省略するようにCMAKEに指示するにはどうすればよいですか? http://www.cmake.org/Wiki/VSConfigSpecificSettings

if(WIN32) 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES COMPILE_DEFINITIONS_DEBUG "_CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/SUBSYSTEM:CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "_CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:windows") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:windows") 
endif(WIN32) 

UPDATEを引用

答えて

6

:この機能は、原因bugの最近のバージョンでは壊れています。私が見つけた1つの回避策は、 "/ SUBSYSTEM:WINDOWS"ではなく "/ SUBSYSTEM:windows"を指定することです。それは何らかの理由でうまくいくようです。

+0

、しかし:

#ifdef _MSC_VER # ifdef NDEBUG # pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") # else # pragma comment(linker, "/SUBSYSTEM:CONSOLE") # endif #endif 

は、あなたが定義した場合にリンカエラーを回避するために、エントリ・ポイントの設定を使用しますこのソリューションはVC++ 2010では動作しません。 – fbafelipe

+0

@fbafelipe、私はVC++ 2010を使用していました。下部に記載されている回避策を適用しましたか? – Gili

+1

はい、私は、stilは動作しませんでした。言いたいことを言いました、それはVC++ 2010です。私はプロジェクトを開くために使用します(ただし、CMakeはVC++ 2010プロジェクトを生成しますが、何の違いもありません)。私は多くのことを試しましたが、LINK_FLAGSをすべての設定に変更しようとしましたが、WINDOWSサブシステムには変わりません。私はWindowsサブシステムを使用することができた唯一の方法は、ADD_EXECUTABLE(名前WIN32ソース)でしたが、コンソールでデバッグを行い、ウィンドウでリリースすることはできません。 – fbafelipe

4

このバグがまだCMakeで修正されていればダンノー。 VC++ 2010 ExpressとCMake v2.8.10.1(現在の最新リリース)を使用していますが、私はまったく同じ問題を抱えています。

作業溶液はhereを提供されました:あなたのソースコードを変更(例えばmain.cppに/ main.cの)追加することによって:に:

#ifndef NDEBUG 
#pragma comment(linker, "/SUBSYSTEM:CONSOLE") 
#endif 

を代わりに、リンカフラグ "WINDOWS/SUBSYSTEM" を追加することができますリリースモードビルド。 I動作するように思われるこの定義を使用しています:私は同じ問題を抱えている

int main(int argc, char* argv[]) { ... } 
関連する問題