2011-10-12 6 views
16

मैं कुछ साल पहले विजुअल स्टूडियो 2010 के साथ अपने सीएमके-आधारित परियोजनाओं में से एक बनाने की कोशिश कर रहा हूं और मैं एक परियोजना के लिए आउटपुट निर्देशिका के साथ समस्याओं में भाग ले रहा हूं। विजुअल स्टूडियो हमेशा बाइनरी आउटपुट करते समय डीबग/और रिलीज/उप-निर्देशिकाओं को जोड़ने पर बहुत उत्सुक रहा है, और विभिन्न कारणों से मैं हमेशा उन्हें हटाने पर बहुत उत्सुक हूं - अब मैं सीएमके का एक नया संस्करण और एक नया संस्करण उपयोग कर रहा हूं विजुअल स्टूडियो, सीएमके में पुराना कामकाज अब काम नहीं कर रहा है, और मैं इसे करने का "नया" तरीका ढूंढ रहा हूं।सीएमके में, मैं डीबग और रिलीज निर्देशिकाओं के आसपास कैसे काम करूं विजुअल स्टूडियो 2010 जोड़ने की कोशिश करता है?

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) और दृश्य स्टूडियो (2008) के पिछले संस्करण के साथ

, मैं निम्नलिखित का इस्तेमाल किया। कृपया किसी को भी एक समान लेकिन अधिक अद्यतित वर्कअराउंड के बारे में पता है जो सीएमके 2.8.6 और विजुअल स्टूडियो 2010 के साथ काम करेगा?

उत्तर

49

यह ठीक से आप जो चाहते हैं उस पर थोड़ा सा निर्भर करता है, लेकिन मैं उपलब्ध target properties पर this question के समान देखने की सलाह दूंगा।

यह वास्तव में आप जो चाहते हैं उस पर थोड़ा सा निर्भर करता है। प्रत्येक लक्ष्य के लिए, आप मैन्युअल रूप से library_output_directory या runtime_output_directory गुण सेट कर सकते हैं।

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) 

आप भी इस सभी उप-परियोजनाओं के लिए विश्व स्तर पर कर सकता है, कुछ इस तरह का उपयोग कर:

# 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_ {config} संपत्तियों के लिए देख रहा था लक्ष्य पर चीयर्स! :) –

+0

मैं वही करता हूं और यह तब तक काम करता है जब तक उदा। add_executable (test test.cpp) get_target_property (test_EXE परीक्षण LOCATION) कहा जाता है, फिर भी इसमें डी:/कोडबेस/टेस्ट/बिन/$ (कॉन्फ़िगरेशन) /test.exe कोई समस्या है कि इस समस्या को कैसे ठीक किया जाए? – choosyg

2

CMake के वर्तमान संस्करण में आप LIBRARY_OUTPUT_DIRECTORY के लिए एक जनरेटर अभिव्यक्ति का उपयोग कर सकते हैं विन्यास विशेष से बचने के लिए प्रत्यय।

मैंने अभी $<$<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>:>) 
संबंधित मुद्दे