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

#visual-c #shared-libraries #conan

#visual-c #общие библиотеки #conan

Вопрос:

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

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

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

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

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

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

Ответ №1:

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

Если вы используете CMake MSVC, вам просто нужно добавить опцию shared. CMake helper переведет эту опцию в определение BUILD_SHARED_LIBS при настройке вашего проекта.

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

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

По параметрам. При создании пакета Conan экспортирует все имена библиотек, которые вы хотите, с помощью 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 вы пытаетесь создать два проекта в одном пакете, что звучит неправильно. Я бы сказал, что вы должны создать отдельные пакеты для каждого из них. Вы могли бы создать один индивидуальный рецепт для каждого проекта. Вы должны помнить, что каждая опция вводит новую точку для идентификатора пакета.