前面总结过如何打包一个存头文件库,那种情况下非常简单,因为只需要将源文件拷贝就行了。现在来研究下如何打包一个正常情况下会生成动态库或静态库的包。参考文档:https://docs.conan.io/en/latest/creating_packages/getting_started.html#creating-the-package-recipe 。

1. 准备源码

这里使用我之前写的一个小工具:https://github.com/243286065/lz-string-cpp/tree/dev 。 在dev分支上将其改成了库。

2. 打包

在windows上,同样,我们需要使用conan命令先创建一个conanfile.py模板出来:

conan new LZStringcpp/1.0.0

然后修改confile.py:

from conans import ConanFile, CMake, tools

class LzstringcppConan(ConanFile):
name = "LZStringcpp"
version = "1.0.0"
license = "MIT"
author = "xl"
url = "https://github.com/243286065/lz-string-cpp/tree/dev"
description = "C++ Class implementation of lz-string (based on https://github.com/pieroxy/lz-string)"
topics = ("LZS", "Compress")
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False]}
default_options = {"shared": False}
generators = "cmake" def source(self):
self.run("git clone -b dev https://github.com/243286065/lz-string-cpp.git")
# This small hack might be useful to guarantee proper /MT /MD linkage
# in MSVC if the packaged project doesn't have variables to set it
# properly
tools.replace_in_file("lz-string-cpp/CMakeLists.txt", "project(LZStringcpp)",
'''project(LZStringcpp)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''') def build(self):
cmake = CMake(self)
cmake.configure(source_folder="lz-string-cpp")
cmake.build() # Explicit way:
# self.run('cmake %s/lz-string-cpp %s'
# % (self.source_folder, cmake.command_line))
# self.run("cmake --build . %s" % cmake.build_config) def package(self):
self.copy("LZString.h", dst="include", src="lz-string-cpp/src")
self.copy("*.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.dylib", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False) def package_info(self):
self.cpp_info.libs = ["LZStringcpp"]

这里先解释下上述脚本的含义:

  • settings 字段定义了不同的二进制包的配置,不同的配置都将需要产生不同的二进制包。如果你想要做交叉编译,可以使用self.settings.os and self.settings.arc
    if platform.system() == "Windows":
cmake = CMake(self)
cmake.configure(source_folder="hello")
cmake.build()
else:
env_build = AutoToolsBuildEnvironment(self)
env_build.configure()
env_build.make()
  • default_options 字段中表示默认提供的是静态库;
  • source 函数用于进行源码准备,这里是执行了 git clone ,你也可以执行http下载什么的。
  • build 中使用cmake来进行构建,你也可以直接调用make、MSBuild等进行构建。
  • package 方法拷贝头文件、库文件到最终的包里。
  • package_info 方法定义了使用者使用这个包时必须链接LZStringcpp这个库。

然后执行执行:

conan create . xl/stable

正常情况下会执行成功,然后可以去.conan目录下查看,可以看到一个新的库,而且是编译好lib文件的。
我们可以把它上传到服务器上:

conan upload LZStringcpp/1.0.0@xl/stable -r develope --all

3. 测试

我们去Ubuntu上,修改上次我们测试rapidjson的测试程序的conanfile.txt:

[requires]
rapidjson/1.1.0@tencent/stable
LZStringcpp/1.0.0@xl/stable [generators]
cmake [imports]
include, * -> ./include
lib, * -> ./lib [options]
LZStringcpp:shared=True

同样在build目录下执行:

conan install ..

它会提示:

这是因为我们是在windows上打包的,而且打包时默认是编译的静态库,所以我们在Ubuntu下要求依赖动态库,它是本来不存在的,于是它就会建议你使用 --build LZString 进行源码构建,于是我们重新运行:

conan install .. --build LZStringcpp -s compiler.libcxx=libstdc++11

结果:

这样我们就能在Linux上直接使用,是不是非常方便。只要conanfile.py的settings字段中的属性不能完全匹配,就可以从源码进行构建。

能够直接从源码构建,这是非常好的一个特性,能够让我们避免维护众多的版本。

注:在Linux上重新使用conan编译库时请加上-s compiler.libcxx=libstdc++11编译参数,否则容易出现链接的问题。

conan使用(四)--打包二进制库的更多相关文章

  1. iOS - swift 后使用打包动态库

    WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的: Frameworks for iOS ...

  2. (四)boost库之正则表达式regex

    (四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...

  3. iOS开发——打包静态库与Framework

    最近老是需要做接口给别的客户,就顺便把打包的过程也写一下吧! 一.静态库 静态图里面只能是纯文件,里面不能再有第三方打包的静态库,也就是说,静态库不能打包静态库.这个用的比较多,一般自己公司写出来的东 ...

  4. iOS打包静态库(完整篇)

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

  5. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  6. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  7. ios打包静态库

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

  8. STC8H开发(四): FwLib_STC8 封装库的介绍和注意事项

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. conan使用(三)--打包只有头文件的库

    参考:https://docs.conan.io/en/latest/howtos/header_only.html?highlight=header%20only 对于只含头文件的库打包非常简单,以 ...

随机推荐

  1. logistic 回归(线性和非线性)

    一:线性logistic 回归 代码如下: import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...

  2. ACM-单向链表的操作

    数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的index和value值,以空格隔 ...

  3. python如何实现元素等待

    一.为什么要元素等待? 在UI自动化过程中,元素的出现受网络环境.设备性能等多种元素影响.因此,元素加载和脚本运行到该元素的时间不一致,会报错:元素无法定位. 简单举下例子:实际UI自动化测试中,点击 ...

  4. 第04组 Alpha冲刺(4/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 才两天,也就是实现一些功能而已 复习 接下来的计划 实现更多的功能 为这周的比赛准备 还剩 ...

  5. Linux学习 (2) CentOS 6 虚拟机挂载磁盘

    1.我们先创建1台CentOS 6.10的虚拟机 2.使用SSH登陆CentOS虚拟机,运行下面的命令: sudo tail -f /var/log/messages ls -l /dev/sd* 可 ...

  6. Kubernetes容器集群管理环境 - Node节点的移除与加入

    一.如何从Kubernetes集群中移除Node比如从集群中移除k8s-node03这个Node节点,做法如下: 1)先在master节点查看Node情况 [root@k8s-master01 ~]# ...

  7. pixijs shader 扫光加强版

    pixijs shader 扫光加强版 const app = new PIXI.Application({ transparent: true }); document.body.appendChi ...

  8. Uboot启动流程分析(一)

    1.前言 Linux系统的启动需要一个bootloader程序,该bootloader程序会先初始化DDR等外设,然后将Linux内核从flash中拷贝到DDR中,最后启动Linux内核,uboot的 ...

  9. CodeForces 463D DP

    Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...

  10. POJ-1129 DFS染色+四色原理的应用

    OJ-ID:     POJ-1129 author:    Caution_X date of submission:    20190927 tags:    DFS+四色原理的应用 descri ...