2011-10-12 9 views
16

私は2年前からVisual Studio 2010で私のCMakeベースのプロジェクトを構築しようとしていますが、私はプロジェクトの出力ディレクトリに関連する問題にぶち当たっています。 Visual Studioは、バイナリを出力するときにDebug/Release/Subdirectoriesを追加することに常に非常に熱心でした。私はいつもそれらを削除することに非常に熱心でした。なぜなら私は新しいバージョンのCMakeと新しいバージョンのCMakeを使用しています。 Visual Studioでは、CMakeの古い回避策はもはや機能していないようで、私はそれを行う「新しい」方法を見つけようとしています。これがうまく働いたCMakeでは、Visual Studio 2010が追加しようとするDebugおよびReleaseディレクトリを回避するにはどうすればよいですか?

IF(MSVC_IDE) 
    # A hack to get around the "Debug" and "Release" directories Visual Studio tries to add 
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES PREFIX "../") 
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES IMPORT_PREFIX "../") 
ENDIF(MSVC_IDE) 

、もはやトリックを行うようだ:CMakeの以前のバージョン(2.6)およびVisual Studio(2008)の以前のバージョンで

は、私は次のように使用していません。 CMake 2.8.6とVisual Studio 2010で動作する似たような、より最新の回避策を知っている人はいらっしゃいますか?

答えて

49

これはちょっとしたことに依存しますが、target propertiesthis questionと似ています)をご覧になることをおすすめします。

これは、正確に何を望むかによって少し異なります。各ターゲットに対して、library_output_directoryまたはruntime_output_directoryのプロパティを手動で設定できます。固有のコンフィギュレーションを避けるためにあなたがLIBRARY_OUTPUT_DIRECTORYのためにジェネレータ式を使用することができますCMakeの現在のバージョンでは

# First for the generic no-config case (e.g. with mingw) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${youroutputdirectory}) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory}) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${youroutputdirectory}) 
# Second, for multi-config builds (e.g. msvc) 
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) 
    string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) 
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory}) 
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory}) 
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory}) 
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES) 
+2

ブリリアント、おかげで - それは結局のところ、私はARCHIVE_OUTPUT_DIRECTORY_ {設定}プロパティを探していましたターゲット上に乾杯! :) –

+0

私はまったく同じことをしています。 add_executable(test test.cpp) get_target_property(test_EXE test LOCATION)が呼び出されましたが、D:/ Codebase/test/bin/$(Configuration)/test.exeにこの問題の修正方法はありますか? – choosyg

2

if (MSVC) 
    set_target_properties(${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory}) 
    set_target_properties(${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${youroutputdirectory}) 
    set_target_properties(${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE ${youroutputdirectory}) 
    # etc for the other available configuration types (MinSizeRel, RelWithDebInfo) 
endif (MSVC) 

はまた、このようなものを使用して、すべてのサブプロジェクトに対してグローバルにこれを行うことができますサフィックス。

$<$<CONFIG:Debug>:>を追加しましたが、これは常に何も展開しません。これは少し奇妙に見えるが、それは仕事をし、そしてそれはあなたが簡単なコメントでそれを説明することはできませんので、奇妙ではありません。

# Use a generator expression so that the specified folder is used directly, without any 
# configuration-dependent suffix. 
# 
# See https://cmake.org/cmake/help/v3.8/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html 
set_target_properties(library PROPERTIES 
         LIBRARY_OUTPUT_DIRECTORY my/folder/$<$<CONFIG:Debug>:>) 
関連する問題