将静态和动态库包与Conan和MSVC ++一起使用

时间:2019-04-24 10:53:25

标签: visual-c++ shared-libraries conan

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

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

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

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

  1. 如何使用Conan和MSVS 2017创建动态和静态库?

  2. 当程序包中包含多个.lib文件时,如何选择链接到的库?

1 个答案:

答案 0 :(得分:1)

  

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

如果您使用的是CMake + MSVC,则只需添加option 共享。配置项目时,CMake helper会将该选项转换为 BUILD_SHARED_LIBS 定义。

但是,如果仅使用Visual Studio,则取决于项目的配置方式。柯南MSBuild可以选择所需的内容,包括目标,体系结构和构建类型。您可以使用不同的目标,每种配置一个。

  

当程序包中包含多个.lib文件时,如何选择链接到的库?

通过选项。创建包时,Conan将通过 self.cpp_info.libs 导出所需的所有库名称。您可以调用 tools.collect_libs(self),它将列出package文件夹中的所有库,也可以列出您想要的内容,例如[library_st,图书馆]。如果需要选择要链接的库,则需要在要列出的库中添加一个选项,否则在链接时将需要忽略CONAN_PKG :::或CONAN_LIBS:

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引入一个新点。