我有一个包含两个项目的MSVS解决方案:DLL一个生成library.lib
和library.dll
,静态库一个生成library_st.lib
。 conanfile.py
将这三个对象打包。
我有另一个conanfile.txt
第一个项目的MSVS解决方案(仅[requires]
)。柯南会生成链接到library.lib
的.props文件,但我找不到用它链接到library_st.lib
的方法。
我尝试将shared=False
传递给库,并更改其package()
方法以仅保存静态库。我不知道如何检查确切的二进制软件包文件,但是在更改之后,我的解决方案仍然尝试链接到“ library.lib”。
我想我的问题分为两部分:
如何使用Conan和MSVS 2017创建动态和静态库?
当程序包中包含多个.lib
文件时,如何选择链接到的库?
答案 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引入一个新点。