【问题标题】:Using static and dynamic library packages with Conan and MSVC++在柯南和 MSVC++ 中使用静态和动态库包
【发布时间】:2019-04-24 10:53:25
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    但是,如果您仅使用 Visual Studio,则取决于您的项目的配置方式。 ConanMSBuild 能够选择你想要的,包括目标、架构和构建类型。您可以使用不同的目标,每个配置一个。

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

    按选项。创建包时,柯南会通过self.cpp_info.libs导出所有你想要的库名。您可以调用 tools.collect_libs(self),它将列出包文件夹中的所有库,或者,您可以列出您想要的,例如[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 引入一个新点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2020-01-13
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多