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

5

这个答案提到了一种方法,可以链接到通过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,但在配置属性下没有“已引用的包”链接: screenshot of Nuget installed packages and of the Configuration Properties without a link to "Referenced Packages 为了完整起见,VS 2015企业版的版本是14.0.25431.01 Update 3,并且我已经检查过当我安装Boost Test Package时,我获得了静态(.lib)和动态(.dll)链接版本,因为我的VS版本的文件在packages文件夹中存在。

4
也许是因为年纪渐长,但 Nuget 对我来说有点太神奇了。 - user0042
2个回答

2
Boost正在使用自动链接。这意味着,Boost源代码根据构建环境和配置决定要使用哪个库(文件)。 更新 这是流程:
1. 将Boost headers only NuGet package添加到您的项目中。 2. 根据您使用的内容和构建配置,Boost可能需要额外的库(lib文件)。在这种情况下,您将收到编译/链接错误。 3. 根据编译/链接错误,您需要向项目中添加其他NuGet包,其中包含来自此处预编译的Boost库。
我同意,这个过程并不明显。为了改进它,Boost应该先完成他们的模块化。我的意思是,当Boost库(头文件和二进制文件)可以单独发货时。

谢谢@sergey,但我认为自动链接避免了需要指定vc140、mt、d等内容的需求...但我仍然需要选择是只使用库头文件、静态库还是动态库,对吗? - Francesco
我已经做了这件事,实际上正如您在截图中所看到的那样,我拥有boost包和预编译库(在截图中您可以看到例如bzip2)。此外,我已经检查了Test库的.lib和.dll文件是否存在于我的系统中,对于各种设置(调试、发布等)都进行了检查。但我的问题是:我如何选择在我的.exe中消耗动态库还是静态库?现在我正在手动链接以避免不必要的重新编译,但这违背了自动链接的目的... - Francesco
顺便说一下,感谢您维护NuGet Boost软件包的努力,非常感激! - Francesco
1
@Francesco 我了解了。一种改变Boost选择包的方式是修改你的C++项目配置。另一种方法是添加"BOOST_ALL_NO_LIB",然后使用"#pragma"或构建配置手动链接包到你的代码中。目前,Boost NuGet 包仅提供库并依赖于自动链接。你可以向GetBoost提出一个功能请求,但我(或其他人)需要设计如何在所有情况下实现这个功能。 - Sergey Shandar

2
“使用Visual Studio 2015,我找不到‘引用的包’选项。”
“这取决于您是否在项目中安装了freeglut包。如果您创建一个没有安装任何NuGet包的C++项目,则无法找到‘引用的包’选项:”

enter image description here

安装了NuGet软件包“freeglut”之后,“引用的软件包”和“项目主设置”会添加到“配置属性”中:

enter image description here

Boost包更新:

更新 Boost 包: 您应该安装 freeglut 包来检查 "引用的包" 和 "项目主设置"。由于您注意到 freeglut 包和 Boost 包之间存在不同行为,我想提供更多关于 本机 NuGet 包 的信息。在将 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 在 C++ 属性中添加选项 "Referenced Packages" 和 "Project Master Settings"。

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

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

因此,“引用的包”和“项目主设置”是否添加,取决于包文件夹中的.targets文件。
如果我进入项目的“管理 Nuget 包”部分,我可以安装或卸载,但是我找不到包的任何详细信息。
在项目的“管理 Nuget 包”部分右侧,您可以注意到更多详细说明:

enter image description here

我已经在 MSDN 上搜索了文档,但所有页面都是关于创建软件包的,而我需要表达如何使用这样的软件包。
您可以参考文档 Consume Packages 了解如何使用软件包。
所讨论的软件包(Boost Unit Test Framework)可以使用头文件、静态链接或动态链接,并且我想知道在哪里可以决定它。
您可以在“项目 -> 属性 -> 配置属性 -> 引用软件包 -> freeglut”中进行决定。

enter image description here


1
我的属性中缺少这个选项。我有常规、调试和VC++目录。我没有“项目主设置”和“引用的包”。如果我去管理Nuget包,结果显示Boost已安装(实际上,我正在使用它的头文件)。 - Francesco
我添加了一张截图以便更清晰地展示。 - Francesco
@Francesco,很抱歉不能为您提供详细的答案,因为我担心过多的信息会给您带来麻烦。由于您的更新问题涉及更多信息,我已经更新了我的答案,并提供了更详细的信息,您可以查看有关Boost包的更新以获取详细信息。 - Leo Liu
实际上,更新信息非常有用:看起来boost包(在其.targets中)与freeglut示例“不同”,因此我找不到该部分。你为什么说“麻烦”?欢迎提供更多信息!是否有MSDN上关于此目标的链接,以便我可以自行修改它。 - Francesco
1
@Francesco,抱歉,我也不知道MSDN上的那个链接:(。如果可能的话,希望你可以从以下链接中获得一些帮助:https://hmemcpy.com/2015/03/adding-a-custom-property-page-to-existing-project-types-in-visual-studio/ 和 https://msdn.microsoft.com/en-us/library/669zx6zc.aspx - Leo Liu
谢谢。与此同时,我在github上开了一个关于这个主题的问题:https://github.com/sergey-shandar/getboost/issues/34 - Francesco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接