2012-09-19 10 views
9

मैं cmake का उपयोग कर एक सी ++/सीएलआई परियोजना स्थापित करने की कोशिश कर रहा हूं।सी ++/सीएलआई और सीएमके

set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCES "${CMAKE_CURRENT_SOURCE_DIR}/../OrionMaster/3rdParty/GMap.NET.Core.dll;System;System.Core;System.Data;System.Drawing;System.Xml;WindowsBase") 
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/clr /EHa") 
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d") 

if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/RTC1") 
    string(REPLACE "/RTC1" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") 
endif() 

if(CMAKE_CXX_FLAGS MATCHES "/EHsc") 
    string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") 
endif() 

जब: मैं सफलता विजुअल स्टूडियो 2010 के साथ ऐसा करने की थी, लेकिन अब मैं एक विरासत समाधान है कि विजुअल स्टूडियो 2008 दृश्य स्टूडियो 2010 में की आवश्यकता है के साथ काम कर रहा हूँ, यह इस तरह मेरे cmake स्थापित करने के लिए पर्याप्त है मैं फिर दृश्य स्टूडियो 2010 के तहत परियोजना की जांच करता हूं, मैं सभी संदर्भ देख सकता हूं और "सामान्य भाषा रनटाइम सपोर्ट" चालू है। जब मैं विजुअल स्टूडियो 2008 में इसे आज़माता हूं, तो मुझे कोई संदर्भ नहीं दिखाई देता है, और प्रोजेक्ट "कोई सामान्य भाषा रनटाइम सपोर्ट" पर सेट नहीं होता है, यदि मैं कंपाइलर विकल्पों को देखता हूं, तो मैं देख सकता हूं कि कंपाइलर को क्लस्टर पास किया जा रहा है । हालांकि मुझे अभी भी बहुत से कंपाइलर त्रुटियां मिलती हैं, शायद इसलिए कि इसमें संदर्भों की कमी है। क्या किसी को इसे ठीक से स्थापित करने का कोई तरीका पता है?

+0

क्या आपने कभी यह पता लगाया था? मुझे एक ही समस्या है (वीएस 2008 में सीएलआर फ्लैग सेट नहीं मिल सकता है)। – Kohanz

+1

हमने छोड़ा नहीं, ऐसा लगता है कि यह बनाम 2008 में टूट गया है, अगर आपको –

+0

पर कुछ पता चला है तो मुझे बताएं कि मैंने/CLR ध्वज को काम करने के लिए सेट किया है। VS2008 प्रॉपर्टी पेज इस विकल्प को नहीं चुनते हैं, लेकिन डीएलएल वास्तव में/clr के रूप में संकलित है। – Kohanz

उत्तर

6

वीएस_DOTNET_REFERENCES संपत्ति का एकमात्र "वास्तविक" स्रोत कोड संदर्भ सीएमके स्रोत फ़ाइल स्रोत/cmVisualStudio10TargetGenerator.cxx में है।

अभ्यास में इसका क्या अर्थ है: VS_DOTNET_REFERENCES केवल विजुअल स्टूडियो 2010 के लिए सीएमके जनरेटर और इसके जेनरेटर के लिए लागू किया गया है। (जो अब वीएस 2012 और 2013 के लिए नवीनतम सीएमके संस्करण में मौजूद है ...)

विजुअल स्टूडियो के पुराने संस्करणों के लिए इस संपत्ति का समर्थन करने के लिए सीएमके स्रोत कोड को संशोधित करना शायद संभव है, लेकिन यह अभी तक काम नहीं किया जा रहा है इस बिंदु।

1

@DLRdave बताते हैं, सीएमके केवल विजुअल स्टूडियो 2010 जनरेटर के लिए ऐसा करता है।

अन्य जनरेटर के लिए इस समाधान के बजाय VS_DOTNET_REFERENCES का प्रयास करें:

# Note that /FU and ${asmPath} must not be separated by a space, else CMake 
# will remove duplicate "/FU" options. 
target_compile_options(target PRIVATE "/FU${asmPath}") 

प्रणाली विधानसभाओं के लिए System.dll, PresentationCore.dll, आदि जैसे आप asmPath के माध्यम से संकलक के लिए एक पूर्ण निरपेक्ष पथ प्रदान करना चाहिए। आपको संदर्भ असेंबली का उपयोग करने की आवश्यकता है और न कि आपके कंप्यूटर पर असेंबली स्थापित नहीं हैं। उदाहरण के लिए, विजुअल स्टूडियो 2008 में 3.5 का लक्ष्य ढांचे के लिए, आप इन निर्देशिका में संदर्भित फ़ाइल के लिए खोज करने के लिए, इस हेतु होगी:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5 
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0 
C:\Windows\Microsoft.NET\Framework\v2.0.50727 

आप ध्यान दें देंगे कि यदि आप करने के लिए MSBuild का उपयोग मानक सी # या सी ++/सीएलआई प्रोजेक्ट बनाएं, आप देखेंगे कि यह उपरोक्त स्थानों में फ़ाइलों के लिए पूर्ण पथ भी पास करता है (बिल्ड लॉग की जांच करने का प्रयास करें)। आप नहीं ऊपर दिखाए गए विरासत v2.0 स्थान को छोड़कर उपर्युक्त स्थानों के बाहर गैर-संदर्भ असेंबली का उपयोग करना चाहते हैं।

अधिक जानकारी के लिए संदर्भ विधानसभाओं पर: http://blogs.msdn.com/b/msbuild/archive/2007/04/12/new-reference-assemblies-location.aspx

दुर्भाग्य से, वास्तव में इन स्थानों को हल करने के लिए नियमों को जानने के लिए, आप C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets फ़ाइल में उताने पड़ जाना। यह वास्तव में सार्वजनिक रूप से दस्तावेज नहीं है। यह भी ध्यान रखें कि ये खोज/समाधान नियम csc.exe /reference या cl.exe /FU झंडे के लिए प्रलेखित के समान नहीं हैं। वे नियम दिखते हैं कि वे रनटाइम असेंबली का उपयोग करते हैं, संदर्भ असेंबली नहीं - जो गलत होगा।