2012-09-19 9 views
9

cmake를 사용하여 C++/CLI 프로젝트를 설정하려고합니다.C++/CLI 및 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와 함께이 일을했다,하지만 지금은 비주얼 스튜디오 2010 비주얼 스튜디오 2008를 필요로하는 기존 솔루션으로 작업하고,이 같은 내 cmake를 설정하기에 충분 그런 다음 Visual Studio 2010 프로젝트를 검토하여 모든 참조를 볼 수 있으며 "공용 언어 런타임 지원"이 켜져 있습니다. Visual Studio 2008에서 시도 할 때 참조가 표시되지 않고 "No Common Language Runtime Support"로 설정됩니다. 컴파일러 옵션을 보면 컴파일러에/clr이 전달되는 것을 볼 수 있습니다. . 그러나 여전히 많은 참조가 부족하기 때문에 컴파일러 오류가 발생합니다. 누구든지 이것을 올바르게 설정하는 방법을 알고 있습니까?

+0

혹시 이것을 알아 냈습니까? 나는 같은 문제 (VS 2008에서 CLR 플래그를 설정할 수 없다)가 있습니다. – Kohanz

+1

우리가 포기하지 않았다면 2008 년 대에서 고장난 것처럼 보였습니다. –

+0

비록/CLR 플래그를 설정하면 작동하는 것으로 나타났습니다. VS2008 속성 페이지는이 옵션을 선택하지 않지만 실제로 DLL은/clr로 컴파일됩니다. – Kohanz

답변

6

VS_DOTNET_REFERENCES 속성에 대한 유일한 "실제"소스 코드 참조는 CMake 소스 파일 Source/cmVisualStudio10TargetGenerator.cxx에 있습니다.

실제 의미 : VS_DOTNET_REFERENCES는 Visual Studio 2010 용 CMake 생성기와이 버전을 상속 한 모든 생성기에 대해서만 구현됩니다. (현재 VS 2012 및 2013에 대한 최신 CMake 버전에 존재합니다 ...)

Visual Studio의 이전 버전에서이 속성을 지원하기 위해 CMake 소스 코드를 수정하는 것이 가능할 수 있지만 아직 완료되지 않았습니다. 이 점.

1

@DLRdave가 지적한 것처럼 CMake는 Visual Studio 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를 사용하는 경우 표준 C# 또는 C++/CLI 프로젝트를 빌드하면 위의 위치에있는 파일에 대한 절대 경로도 전달된다는 것을 알 수 있습니다 (빌드 로그를 검사 해보십시오). NOT 위에 표시된 레거시 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 플래그에 대해 설명 된 규칙과 동일하지 않습니다. 이러한 규칙은 참조 어셈블리가 아닌 런타임 어셈블리를 사용하는 경향이있는 것으로 보이며 잘못된 것입니다.