Использование статических и динамических библиотечных пакетов с Conan и MSVC ++ - PullRequest
1 голос
/ 24 апреля 2019

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

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

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

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

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

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

1 Ответ

1 голос
/ 24 апреля 2019

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

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

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

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

По параметрам.При создании пакета Conan экспортирует все нужные вам имена библиотек с помощью self.cpp_info.libs .Вы можете вызвать tools.collect_libs (self) , который выведет список всех библиотек в папке пакета или вы можете указать то, что вам нужно, например [library_st, library].Если вам нужно выбрать библиотеку, которую вы хотите связать, вам нужно добавить опцию с библиотекой, которая должна быть в списке, в противном случае вам нужно будет игнорировать 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Вы пытаетесь построить два проекта в одном пакете, что звучит неправильно.Я бы сказал, что вы должны создавать отдельные пакеты для каждого.Вы можете создать один индивидуальный рецепт для каждого проекта.Следует помнить, что каждая опция вводит новую точку для идентификатора пакета.

...