2011-10-12 8 views
16

Birkaç yıl önce Visual Studio 2010 ile CMake tabanlı projelerimden birini oluşturmaya çalışıyorum ve bir proje için çıkış dizini ile ilgili olarak sorunlara karışıyorum. Visual Studio her zaman Debug/ve Release/subdirectories eklemek için çok istekli olmuştur, ikili çıktılar ve çeşitli nedenlerden dolayı bunları kaldırmak için çok hevesliyim - şimdi CMake'in yeni bir sürümünü kullanıyorum ve yeni bir versiyonunu kullanıyorum Visual Studio, CMake'deki eski geçici çözüm artık işe yaramıyor gibi görünüyor ve ben bunu yapmanın "yeni" yolunu bulmak için arıyorum.CMake'de, Visual Studio 2010'un hata ayıklama ve yayınlama dizinlerini nasıl ekleyebilirim?

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) 

Bu iyi çalıştı, ama artık hileye neden olabilir: CMake önceki bir sürümüne (2.6) ve Visual Studio (2008) önceki bir sürümü ile

, aşağıdaki kullanılır. Lütfen CMake 2.8.6 ve Visual Studio 2010 ile çalışacak benzer ama daha güncel bir çözümü bilen var mı?

cevap

49

Tam olarak ne istediğinize bağlı olarak değişir, ancak this question benzeri target properties kullanılabilir bir göz atmanızı öneririz.

Tam olarak ne istediğinize bağlı. Her hedef için, library_output_directory veya runtime_output_directory özelliklerini el ile ayarlayabilirsiniz. Özgü konfigürasyon önlemek için size LIBRARY_OUTPUT_DIRECTORY için jeneratör ifade kullanabilirsiniz CMake güncel sürümlerinde

# 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

Parlak, teşekkür - çıkıyor ben ARCHIVE_OUTPUT_DIRECTORY_ {yapılandırma} özelliklerine arıyordu hedefe. Şerefe! :) –

+0

Tam olarak aynısını yapıyorum ve ör. add_executable (test test.cpp) get_target_property (test_EXE test LOCATION) denir, hala D:/Codebase/test/bin/$ (Yapılandırma) /test.exe var, bu sorunu nasıl düzeltebiliriz? – 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) 

Ayrıca böyle bir şey kullanarak, tüm alt projeler için küresel Bu yapabileceğini soneki.

Ben her zaman hiçbir şey için, benim için genişler $<$<CONFIG:Debug>:> ekledim. Bu biraz garip görünüyor, ama çalışır ve bunu kısa bir açıklama ile bunu açıklayamam çok tuhaf değil:

# 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>:>) 
İlgili konular