Использование пакетов статических и динамических библиотек с Conan и MSVC ++

У меня есть решение MSVS с двумя проектами: одна DLL генерирует library.lib и library.dll, статическая библиотека генерирует library_st.lib. conanfile.py упаковывает эти три объекта в package.

У меня есть другое решение MSVS (только conanfile.txt), которое [requires] является первым проектом. Конан создает файл .props, который ссылается на library.lib, и я не могу найти способ связать его с library_st.lib.

Я попытался передать shared=False библиотеке и изменить ее метод package(), чтобы сохранить только статическую библиотеку. Я не знаю, как проверить точные файлы бинарных пакетов, но мое решение все еще пытается подключиться к «library.lib» после этого изменения.

Думаю, мой вопрос состоит из двух частей:

  1. Как создать динамическую и статическую библиотеки с Conan и MSVS 2017?

  2. Как выбрать библиотеку, на которую я буду ссылаться, если в пакете несколько .lib файлов?


person Chulup    schedule 24.04.2019    source источник


Ответы (1)


Как создать динамическую и статическую библиотеки с Conan и MSVS 2017?

Если вы используете CMake + MSVC, вам просто нужно добавить вариант общий. Помощник CMake переведет этот параметр на < em> BUILD_SHARED_LIBS при настройке вашего проекта.

Однако, если вы используете только Visual Studio, это зависит от того, как настроен ваш проект. Конан MSBuild может выбрать то, что вы хотите, включая цель, архитектуру и тип сборки. Вы можете использовать разные цели, по одной для каждой конфигурации.

Как выбрать библиотеку, на которую я буду ссылаться, если в пакете есть несколько файлов .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"]

ИМО, вы пытаетесь создать два проекта в одном пакете, что звучит неправильно. Я бы сказал, что вам следует создавать отдельные пакеты для каждого из них. Вы можете создать один индивидуальный рецепт для каждого проекта. Вы должны помнить, что каждая опция вводит новую точку для идентификатора пакета.

person uilianries    schedule 24.04.2019