Visual Studio 的 C/C++ 二进制包管理
Conan C/C++ 包管理器可以与任何构建系统配合使用,以管理和共享二进制文件,并定位任何操作系统、编译器和架构。这篇博文提供了一个简短的教程,展示了如何使用 Conan 直接通过纯 Visual Studio 方法创建、共享和使用二进制包。
Microsoft 推出了 vcpkg,这是一个基于 CMake 脚本的 Visual Studio 包管理器。虽然它可以用于从源代码获取和构建 OSS 库的最新稳定版本,但在用作用户项目的依赖项管理器时,它也有一些限制。其中之一是项目通常规模较大,需要管理预构建的二进制文件,因为并非总是可行从源代码构建。另一个不便之处是,同时安装同一包的不同版本需要管理 vcpkg 的不同实例。
在本教程中,您将看到 Conan 可用作纯 Visual Studio 和混合堆栈的包管理器。您还将看到,当使用 Conan 时,您无需从源代码构建;您还可以根据需要管理和共享尽可能多的配置的二进制文件。
本教程的主要步骤是
- 克隆并构建一个示例“Hello World” Visual Studio 项目
- 从现有项目创建 Conan 包
- 为不同的配置创建多个包二进制文件
- 将包上传到您的 Conan 服务器或 JFrog Artifactory
- 在使用者 Visual Studio 项目中重用现有包和二进制文件
- 从使用者项目创建 Conan 包
一个“Hello World” Visual Studio 项目
首先克隆现有的示例存储库。它包含一个简单的“Hello World”库和相应的应用程序
$ git clone https://github.com/memsharded/hello_vs
$ cd hello_vs
它包含一个包含源代码的src
文件夹和一个包含 Visual Studio 2015 解决方案的build
文件夹,该解决方案包含 2 个项目:一个名为“HelloLib”的静态库和一个名为“Greet”的应用程序。打开 Visual Studio 解决方案
$ build\HelloLib\HelloLib.sln
将Greet
设置为启动项目(右键单击Greet
并选择设置为启动项目
)然后使用 Ctrl+F5 构建并运行应用程序。(调试 -> 不调试启动)。请注意,由于hello.cpp
文件包含一个#ifdef _DEBUG
来在调试和发布消息之间切换,因此您可以切换到发布模式并获得不同的输出。
$ Hello World Debug!
# Switch IDE to Release mode, build and run again
$ Hello World Release!
创建 Conan 包
克隆的存储库已包含 Conan 配方
class HelloConan(ConanFile):
name = "Hello"
version = "0.1"
license = "MIT"
url = "https://github.com/memsharded/hello_vs"
settings = "os", "compiler", "build_type", "arch"
exports_sources = "src/*", "build/*"
def build(self):
cmd = tools.msvc_build_command(self.settings, "build/HelloLib/HelloLib.sln")
self.run(cmd)
def package(self):
self.copy("*.h", dst="include", src="src")
self.copy("*.lib", dst="lib", keep_path=False)
def package_info(self):
self.cpp_info.libs = ["HelloLib"]
此配方使用msvc_build_command()
函数获取包含使用正确配置构建应用程序所需命令的命令字符串。
该配方还包含一个test_package
文件夹,其中包含一个简单的示例使用者应用程序。在此示例中,使用者应用程序使用 CMake 进行构建,但它也可以使用 Visual Studio。我们使用 CMake 是因为它是由conan new
生成的默认值,并且为了表明从 Visual Studio 项目创建的包也可以被其他构建系统(如 CMake)使用。这展示了 Conan 如何将构建系统解耦,这有助于例如逐步迁移到新的构建系统。
现在我们准备创建包了,建议关闭 Visual Studio IDE,清理 Visual Studio 的临时构建文件以避免出现问题,然后创建并测试包(此处使用系统默认值,假设它们是 Visual Studio 14、Release、x86_64)
# close VS
$ git clean -xdf
$ conan test_package
...
> Hello World Release!
除了关闭 IDE 并运行git clean
之外,我们还可以配置exports_sources
字段中更智能的过滤器,以便不会将临时构建文件导出到配方中。
为不同的配置创建不同的二进制文件
可以重复此过程以创建和测试不同配置的包
$ conan test_package -s arch=x86
$ conan test_package -s compiler="Visual Studio" -s compiler.runtime=MDd -s build_type=Debug
$ conan test_package -s compiler="Visual Studio" -s compiler.runtime=MDd -s build_type=Debug -s arch=x86
您可以列出已创建的不同包二进制文件
$ conan search Hello/0.1@memsharded/testing
上传二进制文件
在本地创建包后,您可以将其上传到 Conan 远程服务器。如果您使用原始用户名“memsharded”(来自 git 克隆)创建它,则可能需要执行conan copy
将其置于您自己的用户名下。当然,您也可以编辑配方或设置环境变量CONAN_USERNAME
来定义您自己的用户名。
另一种方法是在远程配置权限,以允许使用不同用户名上传包。Artifactory 将允许这样做,但默认情况下,conan_server 不会;必须在server.conf
的[write_permissions]
部分中明确提供权限。
$ conan upload Hello/0.1@memsharded/testing --all -r=myserver
重用包
要直接从 Visual Studio 使用现有包,Conan 提供了visual_studio
生成器。让我们克隆一个现有的“Chat”项目,该项目包含一个利用先前“Hello World”包的“ChatLib”静态库,以及一个调用“ChatLib”库函数的“MyChat”应用程序。
$ git clone https://github.com/memsharded/chat_vs
$ cd chat_vs
与前面的示例一样,存储库在build
文件夹中包含一个 Visual Studio 解决方案。但是,如果您尝试打开它,它将无法加载。这是因为它期望找到一个包含有关依赖项所需信息的文件,因此您必须首先获取该文件。只需运行
$ conan install .
您将看到它创建了两个文件:一个包含当前依赖项配置的conaninfo.txt
文件,以及一个包含 Visual Studio 属性(如<AdditionalIncludeDirectories>
)的conanbuildinfo.props
文件,因此它能够找到已安装的依赖项。
现在您可以打开 IDE 并构建并运行应用程序(顺便说一句,所有聊天功能都只是根据构建类型调用hello()
函数两到三次)
$ build\ChatLib\ChatLib.sln
# Switch to Release
# MyChat -> Set as Startup Project
# Ctrl + F5 (Debug -> Run without debugging)
> Hello World Release!
> Hello World Release!
如果您希望链接到 Hello 包的调试版本,只需安装它并更改 IDE 构建类型即可
$ conan install . -s build_type=Debug -s compiler="Visual Studio" -s compiler.runtime=MDd
# Switch to Debug
# Ctrl + F5 (Debug -> Run without debugging)
> Hello World Debug!
> Hello World Debug!
> Hello World Debug!
从使用者项目创建包
现在您可以关闭 IDE 并清理临时文件
# close VS IDE
$ git clean -xdf
同样,存储库中有一个conanfile.py
包配方以及一个test_package
。该配方与之前的配方几乎相同,但有两个细微的差别
requires = "Hello/0.1@memsharded/testing"
...
generators = "visual_studio"
这将允许我们创建和测试“ChatLib”库的包
$ conan test_package
...
> Hello World Release!
> Hello World Release!
您还可以像上面一样对不同的构建类型和架构重复此过程。ChatLib 库的二进制包也可以上传和共享。
其他配置
以上示例在 VS2017 中“按原样”有效,因为 VS 支持从先前版本升级。tools.msvc_build_command()
已经实现了此功能,因此您可以使用 VS2017 构建和测试包。唯一的要求是定义VS150COMNTOOLS
环境变量,因为 VS2017 没有定义它,并且需要它来查找工具
# maybe better done system-wide after VS2017 installation
$ set VS150COMNTOOLS C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/Common7/Tools
$ conan test_package -s compiler="Visual Studio" -s compiler.version=15
如果需要,您还可以为旧版本的 Visual Studio 构建。在这种情况下,您的构建文件夹中可能会有不同的解决方案项目。然后,该配方只需选择正确的项目,例如
def build(self):
# assuming HelloLibVS12, HelloLibVS14 subfolders
sln_file = "build/HelloLibVS%s/HelloLib.sln" % self.settings.compiler.version
cmd = tools.msvc_build_command(self.settings, sln_file)
self.run(cmd)
结论
首先,注意一点。目前,visual_studio
是一个单配置生成器(即,包包含调试或发布工件,这通常是推荐的方法)。它不支持多配置包(即包含调试和发布工件的包)。如果您需要此功能,请通过在github中提交问题来报告并提供反馈。
Microsoft Windows 和 Visual Studio 一直都是 Conan 中的一等公民。许多 OSS 工具主要是为“nix”类环境创建的,对 Windows 的支持后来作为事后考虑,有时需要使用不方便的解决方法。虽然 Conan 文档和示例主要出于方便起见使用 CMake,但这并不是必需的。这篇博文表明,Conan 可用作纯 Visual Studio 和使用其他构建系统的混合堆栈的包管理器。并且不仅可以从源代码构建,还可以管理和共享 Conan 远程服务器(Artifactory 或 conan_server)中所需尽可能多的配置的二进制文件。
有任何反馈吗?请在@conan_io或通过电子邮件告知我们:info@conan.io