在 Conan 和 MSVC++ 中使用静态和动态库包

Using static and dynamic library packages with Conan and MSVC++

我有一个包含两个项目的 MSVS 解决方案:DLL 一个生成 library.liblibrary.dll,静态库一个生成 library_st.libconanfile.py 将这三个对象打包到包中。

我有另一个 MSVS 解决方案(仅限 conanfile.txt[requires] 第一个项目。柯南生成 link 到 library.lib 的 .props 文件,我找不到用它 link 到 library_st.lib 的方法。

我尝试将 shared=False 传递给库并更改其 package() 方法以仅保存静态库。我不知道如何检查确切的二进制包文件,但我的解决方案在更改后仍然尝试 link 到 'library.lib'。

我想我的问题分为两部分:

  1. 如何用柯南和MSVS 2017创建动态库和静态库?

  2. 当包中有多个 .lib 文件时,如何选择我 link 到哪个库?

How to create dynamic and static library with Conan and MSVS 2017?

如果您使用的是 CMake + MSVC,您只需添加 option shared. CMake helper 即可在配置项目时将该选项转换为 BUILD_SHARED_LIBS 定义。

但是,如果您只使用 Visual Studio,这取决于您的项目是如何配置的。 Conan MSBuild 能够 select 你想要的,包括目标、架构和构建类型。您可以使用不同的目标,每个配置一个。

How to choose which library I link to when package has several .lib files in it?

按选项。创建包时,柯南会导出你想要的所有库名self.cpp_info.libs。您可以调用 tools.collect_libs(self),这将列出包文件夹中的所有库,或者您可以列出您想要的内容,例如[library_st,图书馆]。如果您需要选择要link的库,则需要添加要列出的库的选项,否则您将需要忽略CONAN_PKG::或CONAN_LIBS时linking:

from conans import Conanfile, MSBuild

class ExampleConan(Conanfile):
    name = "example"
    version = "0.1.0"
    settings = "os", "arch", "build_type", "compiler"
    options = {"shared": [True, False], "st": [True, False]}
    default_options = {"shared": False, "st": False}
    exports = "*"
    _msvc_archs = {"x86": "x86", "x86_64": "x64"}

    def build(self):
        msbuild = MSBuild(self)
        msbuild.build("Example.sln", platforms=self._msvc_archs)

    def package(self):
        library_folder = os.path.join(self._msvc_archs[self.settings.arch.value], self.settings.build_type.value)
        self.copy("*.lib", src=library_folder, dst="lib")
        if self.options.shared:
            self.copy("*.dll", src=library_folder, dst="bin")

    def package_info(self):
        self.cpp_info.libs = ["library_st"] if self.options.st else ["library"]

IMO 你正试图在同一个包中构建两个项目,这听起来不对。我会说你应该为每个人创建单独的包。您可以为每个项目创建一个单独的配方。您应该记住,每个选项都会为包 ID 引入一个新点。