设置通过Nuget安装的C ++库的链接类型

时间:2017-08-20 17:56:00

标签: c++ visual-studio visual-studio-2015 nuget nuget-package

这个answer提到了以下方法链接到通过Nuget安装的C ++库的静态​​版本[在本例中为“freeglut”]:

Project->Properties->Configuration Properties->Referenced Packages->freeglut->Linkage (select static) 

使用Visual Studio 2015,我找不到“Referenced Packages”。我拥有的Nuget包的唯一显式引用是packages.config xml文件。如果我转到项目的“管理Nuget包”部分,我可以安装或卸载,但我找不到包的任何细节。

我搜索了msdn的文档但是所有的页面都专门用于创建一个包,而我需要采用这种方式来使用这样的包。有问题的程序包(Boost Unit Test Framework)可以使用标题,静态或动态链接,我想知道我可以在哪里决定它。

也许我变老了,但Nuget对我来说有点太神奇了......

更新

这就是我所看到的 - 您可以看到安装了Nuget软件包,特别是boost,但是在Configuration属性下没有指向“Referenced packages”的链接: screenshot of Nuget installed packages and of the Configuration Properties without a link to "Referenced Packages

为完整起见,VS 2015 Enterprise的版本为:

  

14.0.25431.01 Update 3

我已经检查过,当我安装Boost测试包时,我得到了静态(.lib)和动态(.dll)链接版本,因为我的VS版本的文件存在于packages文件夹中。

2 个答案:

答案 0 :(得分:2)

  

使用Visual Studio 2015,我找不到“Referenced Packages”。

这取决于您是否已将freeglut软件包安装到项目中。如果您创建的C ++项目没有安装任何NuGet包,则无法找到“Referenced Packages”:

enter image description here

安装nuget软件包freeglut”后,“Referenced Packages”和“Project Master Settings”将添加到Configuration Properties:< / p>

enter image description here

Boost套餐更新 您应该安装包freeglut以检查“Referenced Packages”和“Project Master Settings”。由于您注意到包freeglutBoost之间的不同行为,因此我想提供有关Native NuGet packages的更多信息。将freeglutBoost安装到项目后,您可以在packages文件夹中找到freeglut.targetsboost.targets(.. \ packages \ freeglut.2.8.1.15 \ build \ native&amp; packages \ boost.1.64.0.0 \ build \ native),用记事本或VS打开它们,你会注意到:

freeglut.targets

<PropertyGroup Label="Debug and static and RuntimeLibraryNull" Condition="( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And '$(Linkage-freeglut.ToLower())' == 'static' And ('$(RuntimeLibrary)' == '')">
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
 </PropertyGroup>
 <PropertyGroup Label="Release and static and RuntimeLibraryNull" Condition="( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And '$(Linkage-freeglut.ToLower())' == 'static' And ('$(RuntimeLibrary)' == '')">
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</PropertyGroup>
<PropertyGroup Label="Debug and ltcg and RuntimeLibraryNull" Condition="( $(Configuration.ToLower().IndexOf('debug')) &gt; -1 ) And '$(Linkage-freeglut.ToLower())' == 'ltcg' And ('$(RuntimeLibrary)' == '')">
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</PropertyGroup>
<PropertyGroup Label="Release and ltcg and RuntimeLibraryNull" Condition="( $(Configuration.ToLower().IndexOf('debug')) == -1 ) And '$(Linkage-freeglut.ToLower())' == 'ltcg' And ('$(RuntimeLibrary)' == '')">
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</PropertyGroup>

这会将选项“Referenced Packages”和“Project Master Settings”通过PropertyGroup添加到C ++属性中。

但在boost.targets文件中,只有:

   <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)..\..\lib\native\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
  </ItemDefinitionGroup>

因此,是否添加“Referenced Packages”和“Project Master Settings”是基于包的文件夹中的.targets文件。

  

如果我转到项目的“管理Nuget包”部分,我可以安装或卸载,但我找不到包的任何细节。

在项目的“管理Nuget包”部分的右侧,您可以注意到更多细节描述:

enter image description here

  

我已经在msdn上搜索了文档,但是所有页面都专门用于创建包,而我需要采用这种方式来使用这种包。

您可以参考文档Consume Packages了解如何使用包。

  

有问题的软件包(Boost Unit Test Framework)可以使用标头,静态或动态链接,我想知道我可以在哪里决定它。

您可以在项目 - &gt;属性 - &gt;配置属性 - &gt;参考包 - &gt; freeglut:

上做出决定

enter image description here

答案 1 :(得分:1)

Boost正在使用自动链接。这意味着,Boost源代码根据构建环境和配置决定使用哪个库(文件)。

更新以下是流程

  1. 您将the Boost headers only NuGet package添加到项目中。
  2. 根据您使用的内容和构建配置,Boost可能需要其他库(lib文件)。在这种情况下,您将收到编译/链接错误。
  3. 根据编译/链接错误,您可以使用here
  4. 中预编译的Boost库向项目添加其他NuGet包

    我同意,这个过程并不明显。为了改进它,Boost应该首先完成模块化。我的意思是,当Boost库(标题和二进制文件)可以单独发货时。