2011-10-12 1 views
16

Visual Studio 2010을 사용하여 몇 년 전부터 CMake 기반 프로젝트 중 하나를 만들려고하고 있으며 프로젝트의 출력 디렉터리와 관련된 문제가 있습니다. Visual Studio는 항상 바이너리를 출력 할 때 디버그/릴리스/하위 디렉토리를 추가하는 데 매우 열중했습니다. 여러 가지 이유 때문에 필자는 항상이를 제거하는 데 매우 열심이었습니다. 이제 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

정확하게 원하는 항목에 따라 조금씩 다르지만, this question과 비슷한 target properties과 같은 것이 좋습니다.

정확히 원하는대로 조금씩 다릅니다. 각 대상에 대해 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>:>) 
관련 문제