NuGetでC++パッケージを作成したい
背景
ポータブルなライブラリ環境を構築するために、必要なライブラリをまとめたNuGetパッケージの作成を行っています。
C++プロジェクトでNuGetを使ってみようよ!(Vol. 2:パッケージ作成編) - Qiita
参考にした上記サイトの通り、プログラムの実行まで行えましたが、もう少し機能の充実を図りたいと考えています。
質問
追加したい機能を優先度順で列挙すると以下のようになります。
- exeがあるフォルダに必要なdllが自動でコピーされる
- DebugとReleaseのモードによってリンクするライブラリがあるパスを変える
- pragma comment をしなくても.libファイルがリンクできている
これらの機能を追加するには、どのようにパッケージを作成すればよいでしょうか?
取り組んだ内容
2と3については、VisualStudioが生成した.vcxprojファイルを参考にして以下の.targetsファイルを作成しました。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets"/>
<PropertyGroup>
</PropertyGroup>
<ItemDefinitionGroup>
<!-- プロジェクトファイルの「構成プロパティ」→「C++」に該当します。 -->
<ClCompile>
<!-- マクロを「HAS_NUGETOPENCV」を定義します。 -->
<PreprocessorDefinitions>HAS_NUGETOPENCV;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<!-- 追加のインクルードディレクトリに追加するフォルダーを指定します。 -->
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)../../build/native/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<!-- プロジェクトファイルの「構成プロパティ」→「リンカー」に該当します。 -->
<Link>
<!-- 追加のライブラリディレクトリに追加するフォルダーを指定します。 -->
<AdditionalLibraryDirectories>$(MSBuildThisFileDirectory)../../build/native/lib/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Link>
<AdditionalDependencies>opencv_world400.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Link>
<AdditionalDependencies>opencv_world400d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
</ItemDefinitionGroup>
</Project>
しかし、コンパイル時にリンクエラーが発生してしまい、.libファイルのリンクが適切にできませんでした。
現状
パッケージフォルダ構成
.nuspec .props .targets ファイルは参考サイトのパスに保存しています。
OpencvNuget
└─build
└─native
├─include
│ └─opencv2
└─lib
├─opencv_world400.lib
└─opencv_world400d.lib
パッケージの構成ファイル
OpencvNuget.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>OpencvNuget</id>
<version>1.0.1</version>
<authors>name</authors>
<owners>name</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Opencv Sample</description>
<releaseNotes>first commit</releaseNotes>
<copyright>Copyright 2019</copyright>
<tags>c++ NuGetTest</tags>
</metadata>
</package>
propsファイルは参考サイトと同一であるため割愛します。