conan
希望有关部门解决。CONAN
两位父亲带着30万元前往缅甸营救儿子。
孩子被骗到缅甸,父亲借钱也要去救孩子。据河南电视台7月10日报道,两位孩子的父亲出境讲述了他们的遭遇。
老马是河南开封人,儿子小春20多岁在外面打工。今年四月,老马从小东的父亲那里得知,儿子和小东被一个骗子骗到缅甸,无法回家。
报警后,老马通过熟人得知渝州有一个蛇头,可以从缅甸营救人,但要价15万元。于是小东的父亲和小东的父亲分别筹集了15万元,交给蛇头,前往边境营救儿子。
到达云南后,蛇头告诉他们和当地关系不佳,无法营救,建议他们另寻他路。蛇头随后安排人前往缅甸,但两次营救都失败了,孩子们的处境更加危险。他们还收到了警告,如果再行动,就会被卖掉。
小春曾给老马发短信说,不要再报警了,否则他们会被杀害。之后,老马和妻子无法再联系到小春,他们的体重也下降了很多。
老马说,他现在最担心的是孩子的安危。他表示,一定会想办法营救孩子,与家人团聚。
两位父亲感到最痛苦和煎熬的是付出和回报的不对等。他们花费了大量的金钱和心力,但孩子仍未获救,甚至面临更危险的境地。这种失落和焦虑是无法用语言表达的。目前,各方正在积极营救孩子,希望能够传来好消息。最后,希望每个人出门时都要小心,做出任何决定前都要与家人商量。
关注我,了解更多。
conan工具
前言昨天总结了一下conan的使用《C++包管理器Conan使用笔记》,今天打算将conan打包的过程再总结一下,因为conan-center也并不是所有的第三方库都有,有些我们自己的三方库或者开源的第三方库并没有提交到conan-center,这是个时候就需要我们自己来打包,整个过程不算特别复杂,你需要具备一些python基础语法,不需要太多,能看懂基本语法就行。因为conan是基于python开发的包管理器,所以打包的时候需要使用pyhon去修改构建过程。这个例子我选择的是一款国产的C++ Web开发框架Drogon,这是一款非常优秀的Web开发框架。Here we go !
准备工作在开始之前,你的系统必须准备conan、cmake、git、编译器,这几个软件才能正常运行下面的例子。也可以参照官方文档,毕竟官方文档的解释是权威的,下面的很多知识在官方文档都有体现和解释:https://docs.conan.io/en/latest/creating_packages.html
查看依赖首先我们要做的事情是查看Drogon有没有依赖其他库,我们从Drogon的WIKI可以看到,Drogon依赖了trantor、jsoncpp、libuuid、zlib、OpenSSL(非必须)、c-ares(非必须)、libbrotli(非必须)、postgreSQL、mariadb、sqlite3这些第三方库,他的依赖关系图如下所示:
Drogon依赖图
可以看到这应该算得上比较复杂的依赖关系了,我们应该注意红色的部分,trantor和drogon这两部分是需要我们自己管理的两个库,trantor也是drogon作者开发用于drogon的网络和工具的库,所以我们需要先将trantor进行打包上传。trantor在这里,通过上图分析可以看见,trantor也有他自己的依赖,OpenSSL、c-ares。我们上conan-center搜索可以发现,这两个库在conan-center已经有了,所以可以直接进行引用。
创建trantor包我们先通过conan new命令创建trantor的包:
$ mkdir trantor && cd trantor$ conan new trantor/1.2.0 -t包名称应该以<包名>/<版本号>[@作者/通道]格式进行管理,其中作者和通道可以忽略,-t代表我们需要测试文件,运行以上代码我们将得到如下文件:
conanfile.pytest_package CMakeLists.txt conanfile.py example.cpp其中conanfile.py就是我们的包管理描述和构建文件,它里面带有包的描述和构建规则,test_package文件夹里面是测试文件,可以理解成消费者,包生成成功之后会使用test_package去引用包并调用里面的测试代码,用于检查打包是否成功。由于篇幅原因就不贴代码上来了!
我们先将包的基本信息修改,license、author、url、description、topics可以去trantor的github上复制下来,https://github.com/an-tao/trantor
对于这个文件代码的详细描述,我建议去看一下官方文档,说得比较详细:https://docs.conan.io/en/latest/creating_packages/getting_started.html,不过我也依然会尝试性的去解释每一个方法代表什么意思,如果你有python基础, 那么不难看出这里面有五个方法,他们代表编译打包的五个阶段,其他比如name、version等可以理解成属性。
config_options你可以理解成在编译前需要做的一些准备,比如针对平台的一些配置之类的。source 这里代表对源代码的操作,比如下载源代码,修改构建规则build 构建和编译的事情在这里package打包的代码在这里,理解成将需要的文件拷贝到包里面准备上传,消费者将使用这些文件package_info 打包的一些信息。包的基础信息填写好了之后我们可以开始了。
添加依赖和构建系统上面我们分析过trantor也有两个依赖,我们需要将依赖添加进去,否则编译的时候会报错,依赖的添加方式和使用的时候是同一个字段,只需要在generators字段下面添加requires字段:
requires = ["openssl/1.1.1i", "c-ares/1.17.1"]这样依赖就被添加进去了,继续添加构建系统,通过查看trantor的CMakeLists.txt文件可以发现,它是通过find_package函数来查找依赖的,并且使用的是cmake提供的路径,所以我们需要在构建字段添加cmake_find_package和cmake_paths这两个值。如下:
generators = "cmake", "cmake_find_package", "cmake_paths"拉取源码和修改构建规则在默认生成的文件里面,source(self)方法有一段运行git的代码self.run("git clone https://github.com/conan-io/hello.git")这是使用git下载源代码,他其实是就是在本机执行一段shell命令,你可以改成其他的。我们将地址改成trantor的地址:
self.run("git clone https://github.com/an-tao/trantor")接下来,我们需要注入conan到目标的CMakeLists.txt里面,使得它可以使用conan来引用依赖,我们需要用到conan给我们提供的工具函数tools.replace_in_file()他有三个参数,第一个参数是目标文件,第二个是查找匹配的字符串,第三个是需要替换的字符串。比如:tools.replace_in_file("test.txt", "hello", '''Hello World !'''),这个例子会将test.txt文件里面的hello替换成Hello World !,需要注意的是第三个参数并不是引号包裹而是六个高撇号包裹起来的,我们将生成的默认tools.replace_in_file函数修改成:
tools.replace_in_file("trantor/CMakeLists.txt", "project(trantor)", '''project(trantor)include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)conan_basic_setup()include(${CMAKE_BINARY_DIR}/conan_paths.cmake)set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH})''')这样,在构建的时候trantor会使用conan提供的依赖环境去生成库文件。
配置构建选项通常,我们是使用库的时候有动态和静态链接库的区别,编译动态和静态链接库我们在build函数里去设置,我们查看trator的CMakeLists.txt文件可以看到有一个BUILD_TRANTOR_SHARED开关来控制编译动态还是静态库,默认是静态链接库,我们在cmake = CMake(self)下面使用definitions给cmake传递参数如下:
if self.options.shared: cmake.definitions["BUILD_TRANTOR_SHARED"] = "On" pass这样我们就可以通过conan的shared变量来控制编译的是静态还是动态库,还记得shared吗?我们在安装的时候执行的命令:conan install .. -o *:shared=True说的就是这里了。可以看一下我的另一篇拙作《C++包管理器Conan使用笔记》,记得将下面的source_folder改成trantor。
打包库文件完成上面这个繁杂的步骤,接下来我们就准备打包库文件了,我们在使用一个库的时候通常需要哪些文件呢?include文件,.lib或者.a文件,.dll或者.so文件,这些都是必须的,所以我们到package函数里面修改一下默认的代码,不过在这之前,我需要尝试解释一下默认代码里面的另一个工具函数self.copy,通过看函数名应该知道,这其实就是一个复制文件的函数,我不太清楚python管这种函数(或者这不是函数?)参数叫啥,我就暂且叫他参数名(错了也不要骂我)?这个函数有四个参数,除了第一个另外三个应该是可选项,第一个参数就是需要拷贝的文件名,它支持通配符。dst字段表示需要拷贝到的目标文件夹,src表示文件来源的目录,keep_path表示是否需要保持文件路径,比如:如果设置为True,文件在src/Debug/lib/拷贝的目标目录为lib那么他的路径为lib/src/Debug/lib/,这个需要自行去实践一下。还有一点值得一提,如果没有指定src将会递归搜索整个项目目录直到找到然后拷贝到目标目录。我这里将keep_path全部使用默认的False。
trantor的目录结构其实算比较简单的,所以这里的改动并不大,只需要把默认的hello改成trantor就好,当然,还有一个细节问题需要我们修改一下,默认生成的代码里面.so文件是拷贝到lib目录里面的,这在用户使用的时候会出现找不到动态链接库,所以需要将lib修改成bin。最后一个是package_info这个我了解得不多,不知道实际有什么意义,暂且将默认的hello改成trantor吧。
测试包至此,我们对包的conanfile.py的修改就结束了,接下来还需要修改测试例子,因为打包结束之后conan会自动编译运行测试例子以保证上面打的包可用。
打开test_package目录,文件CMakeLists.txt和conanfile.py在生成的时候conan已经帮我们把依赖引用的代码写好了,这里的conanfile.py和上文修改的并不一样,这个是消费者使用的文件,可以看一下我的另一篇拙作《C++包管理器Conan使用笔记》,虽然没提到用conanfile.py但是作用和conanfile.txt作用一致。我们需要改的是example.cpp文件,它里面生成了一些非常简单的代码,但是这并不能验证trantor可用,复制下面的代码:
#include <iostream>#include <trantor/utils/Date.h>using namespace trantor;int main(int argc, char* argv[]) { std::cout << "Trantor Now is: " << Date::now().toFormattedString(true) << std::endl; return 0;}这段代码会使用trantor里面的方法返回当前的系统时间并输出到控制台。接下来就交给conan了。
创建并测试包下面,我们将使用conan create命令生成trantor库文件,在项目根目录执行命令:
$ conan create .这里说一下,conan create .命令其实是conan export .和conan install trantor/1.2.0 --build=trantor和conan test test_package trantor/1.2.0指令的集合,你可以分开执行。我们在创建的时候可以传递一些设置,像conan install命令一样,比如:conan create . -o trantor:shared=True。还记得第五小节的配置吗?这个命令就能让第五小节的设置生效,或者传递-s build_type=Debug区分开发包和发行包, 如果你看到如下输出:
trantor/1.2.0 (test package): Running test()Trantor Now is: 20210303 09:12:10.254014那么,打包就算大功告成了。我们使用就能像其他包一样正常使用了。当然,现在只是在我们本机使用,conan支持自建私服我们可以将包通过conan upload上传到我们私服,这点我后面会继续写一篇相关的文章。
本例子的项目已上传GitHub:https://github.com/guosuying2012/trantor-conan
总结总的来说trantor的配置还是比较简单的,里面的弯弯绕并不是特别多,这也给了我继续下去的信心,毕竟刚开始,需要循序渐进的去了解conan打包的一些知识,配合阅读官方文档,整个过程算是比较轻松,只是过程中难免踩到一些坑,但是官方文档上面有非常详细的解释,所以也能很好的应对,至少这是一个很好的开头。
热爱生活,热爱编程,加油!!
2021年3月3日 农历正月二十
转载自:
https://www.yengsu.com/2021/03/03/%e4%bd%bf%e7%94%a8conan%e6%89%93%e5%8c%85%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93%e3%80%90trantor%e7%af%87%e3%80%91/
conan是什么意思
Sir Arthur Conan Doyle阿瑟柯南道尔双语对照例句:
1.Evidently sir arthur conan doyle took his writing so seriously that he tried his hand at it himself. 显然,柯南道尔对于他的侦探故事过于认真,以至于亲自涉足案件中。
2.Guess that means that sir arthur conan doyle brought to life another consultant joke: a consultant is someone who comes in to solve a problem and stays around long enough to become part of it. 你可猜到,阿瑟柯南道尔爵士由此带给人们另一个关于“顾问”的笑话:所谓顾问,就是为了解决问题而来,结果卷入其中太久,反而成了问题的一部分的人。