9

C++ 라이브러리 (헤더 집합, 가져 오기 라이브러리 및 DLL)를 구축 중입니다. 이 라이브러리를 사용하고자하는 개발자라면이 라이브러리를 가능한 한 쉽게 사용하고 싶습니다. 특히이 라이브러리의 소비자는 프로젝트의 다른 구성 (Debug | Release 및 x86/x64/ARM)에 대해 헤더 경로, 라이브러리 경로 및 라이브러리를 수동으로 변경하는 것에 대해 걱정할 필요가 없습니다. 속성 시트를 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. 이 목적을 위해 6 개의 다른 속성 시트를 만들었습니다 (각 구성마다 하나씩).C++ 라이브러리 사용을 쉽게하기 위해 Visual Studio 속성 시트 만들기

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <_PropertySheetDisplayName>MyCPPLib, 1.0</_PropertySheetDisplayName> 
    </PropertyGroup> 
    <ItemDefinitionGroup> 
    <ClCompile> 
     <AdditionalIncludeDirectories>$INCLUDEPATH;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
    </ClCompile> 
    <Link> 
     <AdditionalLibraryDirectories>$(AdditionalLibraryDirectories);$LIBPATH\x86\Debug</AdditionalLibraryDirectories> 
     <AdditionalDependencies>MyCPPLib.lib;$(AdditionalDependencies)</AdditionalDependencies> 
    </Link> 
    </ItemDefinitionGroup> 
</Project> 

하는 나는 그것이 가능 할 수있는 단 하나의 소품 파일을 만들 수 있는지 알고 싶어 : | (매크로의 INCLUDEPATH 및 LIBPATH가 올바르게 정의되어 있다고 가정 디버그 버전 만 86 목록) 각각의 시트는 다음과 같습니다 사용자의 활성 구성이 무엇이든간에 6 가지 구성을 모두 고려해야합니까? 그 파일은 어떻게 생겼을까요? 당신은 단지 같은 구조로 라이브러리 바이너리를 설치할 수 있습니다

+1

누군가가 표준 "Release"및 "Debug"구성 이상을 정의하는 것이 가능할 수도 있음을 명심하십시오. 예를 들어, 정적 라이브러리를 빌드하는 것과 .dll을 빌드하는 것을 구별하기 위해 사용자 지정 구성을 정의하는 몇 가지 프로젝트를 알고 있습니다. –

+0

@BillyONeal 예. 내 라이브러리에 대한 기본 "디버그"및 "릴리스"를 지원하는 것이 기쁠 것입니다. 나는이 속성 시트 물건에 새로운입니다. 이 6 가지 결합에 대해 어떻게 보일지 아십니까? –

+1

흠, 나는 얼마 전에 그런 짓을했다. 나는 내일 그것을보아야하는 것을 잊지 않으려 고 노력할 것이다. 실현의 열쇠는 실제로는 MSBuild 파일이라는 것입니다. 그리고 당신은 평범한 MSBuild에서 조건을 잘 수행 할 수 있습니다 (하지만 구문을 기억할 수는 없습니다). 플랫폼 구성과는 별도로 빌드 구성 (디버그/릴리스)을 처리하기 시작했을 때 내 등록 정보 시트가 훨씬 단순 해졌음을 알았습니다. "바보 같은"문자열 하나를 연결 한 다음 빌드 설정을 결정하는 데 사용합니다 "컨벤션 기본적으로 VS 프로젝트 파일에 있습니다. :) – jalf

답변

3

:

<toplevelsdkdir> 
    |-> lib 
     |-> x86 
      |-> Debug 
      |-> Release 
     |-> x64 
      |-> Debug 
      |-> Release 

그리고 단지 하나의 프로젝트 전체의 소품을 만들 수는 다음과 같이 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <_PropertySheetDisplayName>MyCPPLib, 1.0</_PropertySheetDisplayName> 
    </PropertyGroup> 
    <ItemDefinitionGroup> 
    <ClCompile> 
     <AdditionalIncludeDirectories>$INCLUDEPATH;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
    </ClCompile> 
    <Link> 
     <AdditionalLibraryDirectories>$(AdditionalLibraryDirectories);$LIBPATH\$(PlatformTarget)\$(Configuration)</AdditionalLibraryDirectories> 
     <AdditionalDependencies>MyCPPLib.lib;$(AdditionalDependencies)</AdditionalDependencies> 
    </Link> 
    </ItemDefinitionGroup> 
</Project> 

당신은 당신이 원하는 경우 INCLUDEPATH 및 LIBPATH 변수를 레지스트리에서 읽은 정보로 대체 할 수 있습니다 (설치 중에 넣을 수 있음).

<ClCompile> 
     <AdditionalIncludeDirectories>$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\Software\MyCompany\MySDK\v1`, `InstallDir`))\INCLUDE;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
</ClCompile> 
관련 문제