【问题标题】:Setting linkage type for C++ library installed via Nuget为通过 Nuget 安装的 C++ 库设置链接类型
【发布时间】:2017-08-20 17:56:00
【问题描述】:

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

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

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

我已经在 msdn 中搜索了文档,但所有页面都专门用于创建包,而我需要明确使用这种包的方式。有问题的包(Boost Unit Test Framework)可以仅用于标头,具有静态或动态链接,我想知道我可以在哪里决定它。

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

更新

这就是我所看到的 - 您可以看到安装了 Nuget 包,尤其是 boost,但是在配置属性下没有指向“引用包”的链接:

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

14.0.25431.01 更新 3

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

【问题讨论】:

  • “也许我老了,但 Nuget 对我来说有点太神奇了……” +1

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


【解决方案1】:

使用 Visual Studio 2015,我找不到“引用的包”。

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

安装 nuget 包后freeglut”,“Referenced Packages”和“Project Master Settings”将添加到Configuration Properties

Boost 包更新: 您应该安装包freeglut 以检查“Referenced Packages”和“Project Master Settings”。由于您注意到包 freeglutBoost 之间的不同行为,我想提供更多关于 Native NuGet packages 的信息。将freeglutBoost 安装到您的项目后,您可以在packages 文件夹中找到freeglut.targetsboost.targets (..\packages\freeglut.2.8.1.15\build\native & 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>

这将通过PropertyGroup 将选项“Referenced Packages”和“Project Master Settings”添加到 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 包”部分的右侧,您可以看到一些更详细的说明:

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

如何使用包可以参考文档Consume Packages

有问题的包(Boost 单元测试框架)可以仅用于标头,具有静态或动态链接,我想知道我可以在哪里决定它。

你可以在Project->Properties->Configuration Properties->Referenced Packages->freeglut上决定:

【讨论】:

  • 我的属性中没有。我有常规、调试、VC++ 目录。我没有“项目主设置”和“引用包”。如果我去管理 Nuget 包,它会导致安装了 Boost(事实上,我正在使用它的头文件)。
  • 为了更清晰,我添加了截图
  • @Francesco,很抱歉没有给你详细的解答,因为我怕信息太多会给你带来困扰。由于您的更新问题涉及更多信息,因此我已使用更多详细信息更新了我的答案,您可以查看 Boost Package 更新以获取详细信息。
  • 实际上更新信息非常有用:似乎 boost 包与 freeglut 示例“不同”(在其 .targets 中),所以我没有找到该部分。为什么说“烦恼”?欢迎提供更多信息! MSDN 上是否有关于此目标的链接,以便我可以自己修改它。
  • @Francesco,对不起,我也不知道 MSDN 上的那个链接 :( 。如果可能,希望你能得到一些帮助:hmemcpy.com/2015/03/…msdn.microsoft.com/en-us/library/669zx6zc.aspx
【解决方案2】:

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

更新流程如下

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

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

【讨论】:

  • 谢谢@sergey,但我的印象是自动链接避免了指定诸如vc140、mt、d之类的东西……但我仍然必须选择是否要使用库头只有,静态的还是动态的,不是吗?
  • 我已经这样做了,实际上正如您在屏幕截图中看到的那样,我同时拥有 boost 包和预编译库(在屏幕截图中您可以看到例如 bzip2)。此外,我检查了测试库的 .lib 和 .dll 文件是否存在于我的系统上,用于各种设置(调试、发布等)。但我的问题是:如何选择在我的 .exe 中是要使用动态库还是静态库?现在我正在手动链接以避免不必要的重新编译,但这违背了自动链接的目的......
  • 顺便说一句,感谢您为维护 nuget boost 包所做的努力,非常感谢!
  • @Francesco 我明白了。一种方法是更改​​ Boost 选择包的方式是更改 C++ 项目配置。另一种方法是添加“BOOST_ALL_NO_LIB”,然后使用“#pragma”或构建配置手动将包链接到您的代码。目前,Boost NuGet 包仅提供库和中继自动链接。您可以向 GetBoost 添加功能请求,但我(或其他人)需要设计此功能在所有情况下的工作方式。
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多