-
2019-10-02 21:45:22
conan/conda Tutorial
conan
conan remote
conan remote list conan remote add conan-center "https://conan.bintray.com" # 添加默认remote,之后可以试用conan-stable的库 conan remote add <REMOTE> https://api.bintray.com/conan/bincrafters/public-conan
conan package development 流程
由于有的时候不想把源码copy到conan packagae里面。需要了解conan create . l
更多相关内容 -
conan-tools-vs-code:柯南工具VS代码扩展
2021-05-25 03:33:12柯南工具 欢迎来到柯南工具的VS Code扩展! 柯南工具使从事基于柯南C ++项目的... conan.installCommand :用于工作空间的定制安装命令 conan.buildCommand :用于工作空间的定制构建命令 0.1.0 柯南工具的初始版本 -
conan-unreal-generator:Conan CC ++程序包管理器的虚幻生成器
2021-02-06 11:40:20Conan C / C ++程序包管理器的虚幻生成器 它是一个生成器程序包,它不是嵌入在主要的conan.io代码库中,而是一个独立的程序包。 阅读了解更多信息。 使用发电机 正在安装 unreal生成器打包在UnrealGen/2.0@... -
Conan.Plugin.HelloWorld:Helloworld Conan插件
2021-05-08 21:26:55当与Conan Compiler一起使用时,并且在具有main方法的项目中,它将自动在该方法的开头插入Console.WriteLine(""Hello World from Conan!"); 用法 检出此存储库 打开并构建解决方案src\TestHelloWorld.sln 运行包含... -
Conan
2021-06-30 15:39:04# 环境 ubuntu:bionic的docker image ...# 安装conan ```shell # pip3 install conan Collecting conan # conan -v Conan version 1.33.0 ``` # 使用conan >官方文档:https://docs.conan.io/en/lates# 环境
ubuntu:bionic的docker image
```shell
docker run -it ubuntu:bionic
```
预装工具
```shell
apt-get install cmake
```
# 安装conan
```shell
# pip3 install conan
Collecting conan
# conan -v
Conan version 1.33.0
```
# 使用conan
>官方文档:https://docs.conan.io/en/latest/getting_started.html## 搜索包
```shell
# conan search poco --remote=conan-center
WARN: Remotes registry file missing, creating default one in /root/.conan/remotes.json
Existing package recipes:
poco/1.8.1 <<< 已有的版本
poco/1.9.3
poco/1.9.4
poco/1.10.0
poco/1.10.1
```
## 导入包
```shell
# conan inspect poco/1.9.4
poco/1.9.4: Not found in local cache, looking in remotes...
poco/1.9.4: Trying with 'conan-center'...
Downloading conanmanifest.txt completed [0.59k]
Downloading conanfile.py completed [12.59k]
Downloading conan_export.tgz completed [0.30k]
Decompressing conan_export.tgz completed [0.00k]
poco/1.9.4: Downloaded recipe revision 0
name: poco
version: 1.9.4
url: https://github.com/conan-io/conan-center-index
homepage: https://pocoproject.org
license: BSL-1.0
```## 编译
```shell
# conan profile new default --detect
Found gcc 7
Found clang 6.0
gcc>=5, using the major as version************************* WARNING: GCC OLD ABI COMPATIBILITY ***********************
Conan detected a GCC version > 5 but has adjusted the 'compiler.libcxx' setting to
'libstdc++' for backwards compatibility.
Your compiler is likely using the new CXX11 ABI by default (libstdc++11).If you want Conan to use the new ABI for the default profile, run:
$ conan profile update settings.compiler.libcxx=libstdc++11 default
Or edit '/root/.conan/profiles/default' and set compiler.libcxx=libstdc++11
************************************************************************************
# conan profile update settings.compiler.libcxx=libstdc++11 default
```
准备三个文件放在同一个目录如:`conan`中
```
conan$ ls
CMakeLists.txt conanfile.txt md5.cpp文件内容:
conan$ cat conanfile.txt
[requires]
poco/1.9.4[generators]
cmake
conan$ cat md5.cpp
#include "Poco/MD5Engine.h"
#include "Poco/DigestStream.h"#include <iostream>
int main(int argc, char** argv){
Poco::MD5Engine md5;
Poco::DigestOutputStream ds(md5);
ds << "abcdefghijklmnopqrstuvwxyz";
ds.close();
std::cout << Poco::DigestEngine::digestToHex(md5.digest()) << std::endl;
return 0;
}conan$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
project(MD5Encrypter)add_definitions("-std=c++11")
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()add_executable(md5 md5.cpp)
target_link_libraries(md5 ${CONAN_LIBS})
```
## conan编译
```shell
conan# mkdir build && cd build
build# conan install ..
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++11
compiler.version=7
os=Linux
os_build=Linux
conanfile.txt: Generated conaninfo.txt
conanfile.txt: Generated graphinfobuild# cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Configuring done
-- Generating done
-- Build files have been written to: /root/buildbuild# cmake --build .
Scanning dependencies of target md5
[ 50%] Building CXX object CMakeFiles/md5.dir/md5.cpp.o
[100%] Linking CXX executable bin/md5
[100%] Built target md5build# ls
CMakeCache.txt Makefile cmake_install.cmake conanbuildinfo.cmake conaninfo.txt
CMakeFiles bin conan.lock conanbuildinfo.txt graph_info.jsonbuild# ./bin/md5
c3fcd3d76192e4007dfb496cca67e13b
```
环境完成!## 打包项目
>官网打包教程:https://docs.conan.io/en/latest/creating_packages/getting_started.html下面要解决的问题是conanfile.txt中的conan包是怎么生成的。按照官网的打包步骤走了一遍,把源码打包成一个conan包。假设我们要将一个hello的源码打包成一个conan包
### 准备源码
```shell
# mkdir mypkg && cd mypkg
//这里会从github上下载hello的程序
/mypkg# conan new hello/0.1 -t
```
### 编译成conan包
+ 方法1:
```shell
/mypkg# conan create . demo/testing
[100%] Built target example
hello/0.1@demo/testing (test package): Running test()
Hello World Release! <<< 执行hello程序
```
+ 方法2:上面的编译步骤等价于
```shell
/mypkg# conan export . demo/testing
/mypkg# conan install hello/0.1@demo/testing --build=hello
# package is created now, use test to test it
/mypkg# conan test test_package hello/0.1@demo/testing
hello/0.1@demo/testing (test package): Running test()
Hello World Release! <<< 执行hello程序
```
### 查看生成的包
```shell
# conan search hello
Existing package recipes:hello/0.1@demo/testing
```
说明已经将hello的程序源码打包成了conan包。 -
ue4-conan-recipes:与UE4兼容的库包的柯南食谱
2021-05-01 02:15:24该存储库包含用于各种库的Conan配方,以方便它们与Unreal Engine 4配合使用。该配方利用中的基础来提供与UE4捆绑的第三方库的兼容性,并避免符号插入问题,以及确保在Linux下针对UE4捆绑的libc ++版本构建所有内容。... -
conan-center-index:ConanCenter存储库的食谱
2021-02-03 04:48:56该存储库包括一个持续集成系统,该系统将为通过提交的配方自动构建Conan软件包。 文献资料 所有文档都可以在同一存储库中找到。 这是一些有趣主题的快捷方式列表: 如果您想学习如何撰写新食谱,请阅读 。 常见... -
最新版conan nexus插件
2022-02-21 23:51:10最新版conan nexus插件 -
Conan Exiles HD Wallpapers New Tab-crx插件
2021-03-14 06:50:05如果您愿意,我们的Conan Exiles游戏扩展将非常适合您,因为它提供了不同的背景,每次您打开它都会显示出来。 它带有各种高品质的壁纸,这将使您的浏览器超级有趣且丰富多彩。 除此之外,我们还添加了一些其他有用的... -
Conan for Qt-开源
2021-04-24 17:04:28Conan-用于Qt的连接分析器是一个C ++库,可提供QObject层次结构,QObject继承,信号/插槽连接和信号发射的可视运行时自省。 当前支持Qt 4.6.0-Qt 4.7.2 -
conan 详解 - (makefile)_files.zip
2021-09-02 15:02:27conan 详解 - (makefile)_files.zip -
cmake-conan-library-template:使用cmake和conan的基本C ++库项目模板
2021-03-14 06:34:06cmake-conan-library-template 使用cmake和conan的基本C ++库项目模板。 -
conan-tools:一些工具
2021-05-28 21:37:22柯南工具 一些工具 咏叹调2 aria2的所有Web UI -
conan入门(七):将自己的项目生成conan包
2022-02-19 12:13:57conan 将自己的项目生成conan包 Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、...conan 将自己的项目生成conan包
Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。
它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任意数量的不同版本的包创建和重用任意数量的不同二进制文件(用于不同的配置,如架构、编译器版本等),在所有平台上使用完全相同的过程。由于它是去中心化的,因此很容易运行自己的服务器来私下托管自己的包和二进制文件,而无需共享它们。@《Conan官方文档》在之前的博客《conan入门(四):conan 引用第三方库示例》中我们以cJSON为例说明了如何在项目中引用一个conan 包。
如何将自己设计的模块以conan包形式打包提供给第三方(客户/同事)使用?
本文将以一个基于 cJSON 库实现字符串解析的模块 jsonlib,说明如何将自己的模块封装成conan提供给第三方使用。
jsonlib示例程序
示例的所有源码都保存在GIT仓库 conan_example的jsonlib分支,请直接克隆代码到本地:
git clone https://gitee.com/l0km/conan_example.git -b jsonlib # -b jsonlib 切换到 jsonlib 分支,等价于 'git checkout jsonlib' 命令
jsonlib是个很简单的库,只有两个文件:
jsonlib.h,jsonlib.c
,只实现了一个功能从JSON字符串中解析name指定的字段内容,结果保存到输出缓冲区,JSON解析的工作实际上是调用cJSON来实现的。以下是实现源码。src/jsonlib.h
/* * jsonlib.h * conan example for library * Created on: 2022/02/18 * Author: guyadong */ #ifndef SRC_JSONLIB_H_ #define SRC_JSONLIB_H_ #ifndef JSONLIB_DLL_DECL # if defined(_WIN32) && !defined(__CYGWIN__) && defined(JSONLIB_IS_DLL) # if defined(JSONLIB_EXPORTS) # define JSONLIB_DLL_DECL __declspec(dllexport) # else # define JSONLIB_DLL_DECL __declspec(dllimport) # endif # else # define JSONLIB_DLL_DECL # endif #endif #include <stddef.h> #ifdef __cplusplus extern "C" { #endif //************************************ // 从JSON字符串中解析name指定的字段内容,结果保存到输出缓冲区 // @param const char * cjs JSON 字符串 // @param const char * name 字段名 // @param char * buffer [out] 输出缓冲区 // @param size_t bufsz 输出缓冲区长度 // @return int 成功返回0,否则返回-1 //************************************ JSONLIB_DLL_DECL int jlib_parse_field(const char* cjs,const char*name, char*buffer,size_t bufsz); #ifdef __cplusplus } #endif #endif /* SRC_JSONLIB_H_ */
src/jsonlib.c
#include "jsonlib.h" #include <cjson/cJSON.h> #include <string.h> #include <stdlib.h> JSONLIB_DLL_DECL int jlib_parse_field(const char* cjs,const char*name, char*buffer,size_t bufsz) { int c = -1; if(cjs && name && buffer && bufsz) { cJSON* j = cJSON_Parse(cjs); if(j) { cJSON* item = cJSON_GetObjectItem(j,name); if(item) { char* s = cJSON_PrintUnformatted(item); if(s && strlen(s) < bufsz) { strncpy(buffer, s, bufsz); c = 0; } free(s); } } cJSON_Delete(j); } return c; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.10.3) # 3.0以上版本才允许使用VERSION option project(JsonTest VERSION 1.0.0 LANGUAGES C) find_package(cJSON REQUIRED) add_library(jsonlib src/jsonlib.c) set_target_properties(jsonlib PROPERTIES PUBLIC_HEADER "src/jsonlib.h") target_link_libraries(jsonlib PUBLIC cjson) target_compile_definitions(jsonlib PRIVATE $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:JSONLIB_EXPORTS> PUBLIC $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:JSONLIB_IS_DLL> )
conan new
现在 jsonlib.h,jsonlib.c,CMakeLists.txt三个文件构成了一个简单但完整的标准CMake项目。
conan_example │ CMakeLists.txt │ └─src jsonlib.c jsonlib.h
怎么把这个小项目封装为conan包呢?如果你看过我的上一篇博客《conan入门(六):conanfile.txt conanfile.py的区别》以及《conan入门(一):conan 及 JFrog Artifactory 安装》就差不多可以知道,一个conan包最关键的就是需要有一个
conanfile.py
脚本来定义包的各种配置。但是要手写一个conanfile.py好像还挺麻烦的,我对python也是只知皮毛。
显然手写是不可能的,
conan new
命令就是用于创建一个新的conan配置文件模板。有了模板,在之上修改就可以了:$ conan new jsonlib/1.0.0 --template cmake_lib File saved: CMakeLists.txt File saved: conanfile.py File saved: src/jsonlib.cpp File saved: src/jsonlib.h File saved: test_package/CMakeLists.txt File saved: test_package/conanfile.py File saved: test_package/src/example.cpp
conan new jsonlib/1.0.0 --template cmake_lib
执行后生成的目录结构如下,可以看到conan很贴心的生成了conanfile.py,jsonlib的源码文件及CMakeLists.txt以及对应的测试代码(test_package)—这是一个完整的conan包项目框架,虽然它不是想我们需要的内容,但有了这个框架总比从头开始写要方便得多:conan_example │ CMakeLists.txt │ conanfile.py │ ├─src │ jsonlib.cpp │ jsonlib.h │ └─test_package │ CMakeLists.txt │ conanfile.py │ └─src example.cpp
上面执行
conan new
命令使用的 --template cmake_lib 参数是Conan的一项目还在实验中的功能,根据指定模板生成Conan项目框架,详细说明参见Conan官方文档:《Package scaffolding for conan new command》conan new
命令的详细说明参见Conan官方文档《conan new》update jsonlib
现在我们在Conan生成的项目框架上,把jsonlib装进去。
conanfile.py
首先如下图修改conanfile.py
CMakeLists.txt
如下图将conan new 生成的CMakeLists.txt的内容合并到jsonlib的CMakeLists.txt中
jsonlib.h jsonlib.c
src/jsonlib.c替换
conan new
生成的src/jsonlib.cpp,src/jsonlib.h 替换
conan new
生成的src/jsonlib.hexample.cpp
将
conan new
生成的test_package/src/example.cpp替换为如下代码,实现简单的jsonlib接口测试test_package/src/example.cpp
#include <stdio.h> #include <jsonlib.h> int main(int argc, char** argv) { char jstr[] = "{\"hello\":\"world\"}"; printf("JSON:%s\n",jstr); char fieldbuf[32]; int c = jlib_parse_field(jstr,"hello",fieldbuf,sizeof(fieldbuf)); if(0 == c){ printf("parsed 'hello' field: %s\n",fieldbuf); } return 0; }
conan create (编译jsonlib)
创建了conanfile.py后,编译conan包非常简单
# 注意是 conan_example jsonlib分支 $ cd conan_example $ conan create . Exporting package recipe jsonlib/1.0.0 exports_sources: Copied 1 '.txt' file: CMakeLists.txt jsonlib/1.0.0 exports_sources: Copied 1 '.c' file: jsonlib.c jsonlib/1.0.0 exports_sources: Copied 1 '.h' file: jsonlib.h jsonlib/1.0.0: A new conanfile.py version was exported jsonlib/1.0.0: Folder: C:\Users\guyadong\.conan\data\jsonlib\1.0.0\_\_\export jsonlib/1.0.0: Exported revision: 5f5439068d01c7592ebbcb724712ce89 ..... ..... Capturing current environment in deactivate_conanrunenv-release-x86_64.bat Configuring environment variables JSON:{"hello":"world"} parsed 'hello' field: "world"
conan create .
根据配置文件 (同级文件夹下的conanfile.py) 构建二进制包
conan create
命令行用法参见Conan官方文档《conan create》conan create
执行成功后,就会将生成的二进制包保存在本地仓库$HOME/.conan/data/jsonlib/1.0.0/_/_package
执行
conan search jsonlib/1.0.0@
会显示二进制包的信息
conan upload(上传到私有制品库)
项目编译成功就可以上执行
conan upload
传到私有制品库了:conan upload jsonlib/1.0.0 -r ${repo} --all # ${repo}为私有制品库的名字
–all 指定上传所有内容(配置文件conanfile.py,源码和二进制包),如果不指定些选项,只上传除二进制包之外的所有文件
关于
conan upload
命令的详细说明参见Conan官方文档:《conan upload》上传成功进入JFrog Artifactory后台就可以看到已经上传的package
总结
上面一套流程做完,可以总结一下,将一个已经有项目封装为conan包的过程:
开始麻烦些,需要用
conan new
创建一个模板,然后修改模板,将自己的代码装进去。如果你对python很熟,可以不需要conan new
创建模板项目,自己手工改就好了。后面就很简单 :
conan create
完成conan 二进制包编译conan upload
负责 conan包的上传发布参考资料
《Package scaffolding for conan new command》
conan系列文章
《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》 -
conan入门(五):conan 交叉编译引用第三方库示例
2022-02-17 17:52:15conan 交叉编译引用第三方库示例 Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、...conan 交叉编译引用第三方库示例
Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。
它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任意数量的不同版本的包创建和重用任意数量的不同二进制文件(用于不同的配置,如架构、编译器版本等),在所有平台上使用完全相同的过程。由于它是去中心化的,因此很容易运行自己的服务器来私下托管自己的包和二进制文件,而无需共享它们。@《Conan官方文档》在上一篇博客《conan入门(四):conan 引用第三方库示例》中我们以cJSON为例说明了如何在项目中引用一个conan 包。那是比较简单的一种编译本机目标代码的应用场景(编译环境是Windows,目标代码也是Windows平台)。在物联应用的大背景下,C/C++开发中跨平台交叉编译的应用是非常广泛的。在使用conan来管理C/C++包(制品库)的环境下,如何实现对交叉编译的支持呢?因为我的工作涉及不少嵌入式平台的开发,conan对交叉编译的支持是我最关心的部分。
本文还是以cJSON 为例 ,说明如何在交叉编译环境下使用Conan引入依赖库。
总得来说,很简单,只需要有工具链文件,就可以完成。
cJSON示例程序
示例的所有源码都保存在GIT仓库 conan_example,请接克隆代码到本地:
git clone https://gitee.com/l0km/conan_example.git
示例程序conan_example,以JSON格式输出使用的cJSON库的版本号。
本文中将介绍如何交叉编译arm平台的conan_exmample示例程序。
TOOLCHAIN_FILE
要实现交叉首先要定义好工具链,我有一个DS-5 ARM的交叉编译器(
arm-linux-gnueabihf
)。已经写好了交叉编译工具链文件conan_example/cmake/ds5-arm-linux-gnueabihf.toolchain.cmake
# This one is important SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_PROCESSOR arm) set(_compiler_prefix "${_compiler_prefix}") if(NOT EXISTS ${_compiler_prefix}) if(NOT $ENV{CROSS_COMPILER_PREFIX} STREQUAL "") set(_compiler_prefix $ENV{CROSS_COMPILER_PREFIX}) elseif(CROSS_COMPILER_PREFIX) set(_compiler_prefix ${CROSS_COMPILER_PREFIX}) else() find_program(_armcc_path armcc) if(NOT _armcc_path) message(FATAL_ERROR "NOT FOUND compiler armcc in system path") endif() get_filename_component(_bin ${_armcc_path} DIRECTORY ) get_filename_component(_compiler_prefix ${_bin} DIRECTORY ) endif() endif() set(_suffix) if(WIN32) set(_suffix .exe) endif() #INCLUDE(CMakeForceCompiler) # Specify the cross compiler #SET(CMAKE_C_COMPILER "${_compiler_prefix}/bin/armcc${_suffix}") #SET(CMAKE_CXX_COMPILER "${_compiler_prefix}/bin/armcc${_suffix}") #SET(CMAKE_AR "${_compiler_prefix}/bin/armar${_suffix}" CACHE FILEPATH "Archiver") SET(CMAKE_C_COMPILER "${_compiler_prefix}/../gcc/bin/arm-linux-gnueabihf-gcc${_suffix}") SET(CMAKE_CXX_COMPILER "${_compiler_prefix}/../gcc/bin/arm-linux-gnueabihf-g++${_suffix}") #CMAKE_C_COMPILER("${_compiler_prefix}/sw/gcc/bin/arm-linux-gnueabihf-gcc${_suffix}" GNU) #CMAKE_CXX_COMPILER ("${_compiler_prefix}/sw/gcc/bin/arm-linux-gnueabihf-g++${_suffix}" GNU) UNSET(CMAKE_C_FLAGS CACHE) #SET(CMAKE_C_FLAGS "--cpu=Cortex-A9 --thumb -Ospace" CACHE STRING "" FORCE) UNSET(CMAKE_CXX_FLAGS CACHE) #SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS} CACHE STRING "" FORCE) UNSET(CMAKE_EXE_LINKER_FLAGS CACHE) #SET(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE) UNSET(CMAKE_AR_FLAGS CACHE) #SET(CMAKE_AR_FLAGS "-p -armcc,-Ospace" CACHE STRING "" FORCE) # set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>") #SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> ${CMAKE_AR_FLAGS} -o <TARGET> <OBJECTS>" CACHE STRING "C Archive Create") # set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>") #SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> ${CMAKE_AR_FLAGS} -o <TARGET> <OBJECTS>" CACHE STRING "CXX Archive Create") #include_directories("${_compiler_prefix}/include") include_directories("${_compiler_prefix}/../gcc/arm-linux-gnueabihf/libc/usr/include/arm-linux-gnueabi") # Where is the target environment SET(CMAKE_FIND_ROOT_PATH "${_compiler_prefix}/../gcc/arm-linux-gnueabihf/libc") # Search for programs in the build host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # For libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) unset(_compiler_prefix)
交叉编译
install cjson(arm)
先要安装arm平台的cjson库,显然,conan中央仓库没有预编译好的arm版本的cJSON库,我们需要通过定义环境变量
CONAN_CMAKE_TOOLCHAIN_FILE
指定工具链文件,执行conan install
时conan找不到arm平台的库就会自动根据CONAN_CMAKE_TOOLCHAIN_FILE
定义的工具链接文件完成arm平台库的编译$ export CONAN_CMAKE_TOOLCHAIN_FILE=/j/conan_example/cmake/ds5-arm-linux-gnueabihf.toolchain.cmake
关于
CONAN_CMAKE_TOOLCHAIN_FILE
及其他conan环境变量定义更详细说明参见Conan官方文档《Environment variables》如上篇博客差不多,执行
conan install
安装arm平台的cJSON库$ cd conan_example $ mkdir build && cd build $ conan install .. -s os=Linux -s arch=armv7 -s compiler=gcc -s compiler.version=4.8 --build cjson Configuration: [settings] arch=armv7 arch_build=x86_64 build_type=Release compiler=gcc compiler.version=4.8 os=Linux os_build=Windows [options] [build_requires] [env] cjson/1.7.13: Not found in local cache, looking in remotes... cjson/1.7.13: Trying with 'conancenter'... Downloading conanmanifest.txt completed [0.17k] Downloading conanfile.py completed [6.55k] Downloading conan_export.tgz completed [0.25k] Decompressing conan_export.tgz completed [0.00k] cjson/1.7.13: Downloaded recipe revision 0 cjson/1.7.13: Forced build from source conanfile.txt: Installing package Requirements cjson/1.7.13 from 'conancenter' - Downloaded Packages cjson/1.7.13:5c3af8d1e83ce3e5b674d9e36b307da418be8145 - Build Cross-build from 'Windows:x86_64' to 'Linux:armv7' Installing (downloading, building) binaries... Downloading conan_sources.tgz completed [0.25k] Decompressing conan_sources.tgz completed [0.00k] cjson/1.7.13: Configuring sources in C:\Users\guyadong\.conan\data\cjson\1.7.13\_\_\source Downloading v1.7.13.tar.gz completed [346.14k] cjson/1.7.13: Copying sources to build folder cjson/1.7.13: Building your package in C:\Users\guyadong\.conan\data\cjson\1.7.13\_\_\build\5c3af8d1e83ce3e5b674d9e36b307da418be8145 cjson/1.7.13: Generator cmake created conanbuildinfo.cmake cjson/1.7.13: Aggregating env generators cjson/1.7.13: Calling build() -- The C compiler identification is GNU 4.8.3 -- The CXX compiler identification is GNU 4.8.3 -- Check for working C compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin/arm-linux-gnueabihf-gcc.exe -- Check for working C compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin/arm-linux-gnueabihf-gcc.exe - works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin/arm-linux-gnueabihf-g++.exe -- Check for working CXX compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin/arm-linux-gnueabihf-g++.exe - works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Conan: called by CMake conan helper -- Conan: called inside local cache -- Conan: Adjusting output directories -- Conan: Using cmake global configuration -- Conan: Adjusting default RPATHs Conan policies -- Conan: Adjusting language standard -- Conan: Adjusting fPIC flag (ON) -- Conan: Checking correct version: 4.8 -- Performing Test FLAG_SUPPORTED_fvisibilityhidden -- Performing Test FLAG_SUPPORTED_fvisibilityhidden - Success -- Configuring done -- Generating done CMake Warning: Manually-specified variables were not used by the project: CMAKE_EXPORT_NO_PACKAGE_REGISTRY -- Build files have been written to: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/build/5c3af8d1e83ce3e5b674d9e36b307da418be8145/build_subfolder Scanning dependencies of target cjson [ 50%] Building C object source_subfolder/CMakeFiles/cjson.dir/cJSON.c.obj [100%] Linking C static library ..\lib\libcjson.a [100%] Built target cjson cjson/1.7.13: Package '5c3af8d1e83ce3e5b674d9e36b307da418be8145' built cjson/1.7.13: Build folder C:\Users\guyadong\.conan\data\cjson\1.7.13\_\_\build\5c3af8d1e83ce3e5b674d9e36b307da418be8145 cjson/1.7.13: Generated conaninfo.txt cjson/1.7.13: Generated conanbuildinfo.txt cjson/1.7.13: Generating the package cjson/1.7.13: Package folder C:\Users\guyadong\.conan\data\cjson\1.7.13\_\_\package\5c3af8d1e83ce3e5b674d9e36b307da418be8145 cjson/1.7.13: Calling package() [100%] Built target cjson Install the project... -- Install configuration: "Release" -- Installing: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/package/5c3af8d1e83ce3e5b674d9e36b307da418be8145/include/cjson/cJSON.h -- Installing: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/package/5c3af8d1e83ce3e5b674d9e36b307da418be8145/lib/pkgconfig/libcjson.pc -- Installing: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/package/5c3af8d1e83ce3e5b674d9e36b307da418be8145/lib/libcjson.a -- Installing: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/package/5c3af8d1e83ce3e5b674d9e36b307da418be8145/lib/cmake/cJSON/cJSONConfig.cmake -- Installing: C:/Users/guyadong/.conan/data/cjson/1.7.13/_/_/package/5c3af8d1e83ce3e5b674d9e36b307da418be8145/lib/cmake/cJSON/cJSONConfigVersion.cmake cjson/1.7.13 package(): Packaged 1 '.h' file: cJSON.h cjson/1.7.13 package(): Packaged 1 '.a' file: libcjson.a cjson/1.7.13 package(): Packaged 1 '.cmake' file: conan-official-cjson-targets.c make cjson/1.7.13 package(): Packaged 1 file: LICENSE cjson/1.7.13: Package '5c3af8d1e83ce3e5b674d9e36b307da418be8145' created cjson/1.7.13: Created package revision a991a9101873de809042280c2b48122c conanfile.txt: Generator cmake created conanbuildinfo.cmake conanfile.txt: Generator txt created conanbuildinfo.txt conanfile.txt: Aggregating env generators conanfile.txt: Generated conaninfo.txt conanfile.txt: Generated graphinfo
-s os=Linux -s arch=armv7 -s compiler=gcc -s compiler.version=4.8 指定交叉编译的目标平台编译器及版本
–build cjson 指定编译cjson库
–build 的可选值(可多个组合):
--build never 禁止编译依赖包,只下载预编译的二进制包,如果没找到预编译包则报错[不可与其他可选值组合]
--build missing 如果依赖包中没有找到预编译的二进制包则从源码编译
--build outdated 如果依赖包中没有找到预编译的二进制包或过期(日期旧于源码)则从源码编译
--build cascade
--build [pattern] 编译包名匹配[pattern]的所有包
--build ![pattern] 编译包名匹配[pattern]的之外所有包
本示例中
--build json
是[pattern] 用法,所以--build json
也是一样的效果--build=json
也是有效的写法关于
conan install
命令更详细的说明参见Conan官方文档《conan install》build conan_example
生成Makeifile 工程文件
$ cd conan_example/build $ cmake .. -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=J:\conan_example\cmake\ds5-arm-linux-gnueabihf.toolchain.cmake -- The C compiler identification is GNU 4.8.3 -- The CXX compiler identification is GNU 4.8.3 -- Check for working C compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin /arm-linux-gnueabihf-gcc.exe -- Check for working C compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/bin /arm-linux-gnueabihf-gcc.exe - works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/b in/arm-linux-gnueabihf-g++.exe -- Check for working CXX compiler: E:/DS-5-v5.26.0/sw/ARMCompiler5.06u4/../gcc/b in/arm-linux-gnueabihf-g++.exe - works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Conan: Adjusting output directories -- Conan: Using cmake global configuration -- Conan: Adjusting default RPATHs Conan policies -- Conan: Adjusting language standard -- Current conanbuildinfo.cmake directory: J:/conan_example/build -- Conan: Checking correct version: 4.8 -- Configuring done -- Generating done -- Build files have been written to: J:/conan_example/build
编译conan_example
$ cmake --build . Scanning dependencies of target json_test [ 50%] Building C object CMakeFiles/json_test.dir/json_test.c.obj [100%] Linking C executable bin/json_test [100%] Built target json_test
上传到私有制品库
对于第三方库我们不需要每次都编译,可以上传到私有制品库
conan upload cjson/1.7.13 -r ${repo} --all # ${repo}为私有制品库的名字,下同
下次再执行conan install …时就可以指定不编译
$ conan install .. -s os=Linux -s arch=armv7 -s compiler=gcc -s compiler.version=4.8 --build never -r ${repo} # --build never 强制不编译 # -r ${repo} 指定从私有制品库获取
conan系列文章
《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》 -
conan, Conan.io 开源 C/C++ 软件包管理器.zip
2019-10-10 02:04:06conan, Conan.io 开源 C/C++ 软件包管理器 柯南一个分布式。开源。C/C++ 包管理。五十英镑的主开发 英镑覆盖率主覆盖率计开发收费图 设置来自二进制文件的这里有很多平台的安装程序,但是如果你想的话,你可以从源代 -
conan入门(一):conan 及 JFrog Artifactory 安装
2022-02-17 16:58:14conan 安装 Conan是一个面向 C 和 C++ 开发人员的软件包管理器。 Conan是通用且便携的。它适用于所有操作系统,包括 Windows、Linux、OSX、FreeBSD、Solaris 等,并且可以针对任何平台,包括桌面、服务器以及嵌入式... -
conan入门(四):conan 引用第三方库示例
2022-02-17 17:47:48conan 引用第三方库示例 Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和... -
超质感Conan Shields 图标下载
2020-12-25 03:49:53……………………该文档为超质感Conan Shields 图标下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看 -
conan, Conan.io 开源 C/C 软件包管理器.zip
2019-09-17 18:27:22conan, Conan.io 开源 C/C 软件包管理器 柯南一个分布式。开源。C/C 包管理。五十英镑的主开发 英镑覆盖率主覆盖率计开发收费图 设置来自二进制文件的这里有很多平台的安装程序,但是如果你想的话,你可以从源代 -
conan入门(八):交叉编译自己的conan包项目
2022-02-19 14:35:22上一篇博客《conan入门(七):将自己的项目生成conan包》中我们以jsonlib为例说明了如何将自己的模块封装成conan提供给第三方使用。 那是比较简单的一种编译本机目标代码的应用场景。在使用conan来管理C/C++包(制品库)... -
Age of Conan script collection french:柯南时代的法国脚本-开源
2021-05-27 11:01:07该版本现已过时,该项目现在由Soldanis管理,可以在此处下载:http://forums.ageofconan.com/showpost.php?s=cb83265189139bb719e5bd778ae5373f1&p=2082764&postcount=9此版本不再是最新的,该项目现在由Soldanis... -
Conan客户端简单使用示例
2021-07-04 11:28:02在https://blog.csdn.net/fengbingchun/article/details/118443862 中对Conan进行了简单介绍,这里调用openssl的接口,写一个简单的test来说明Conan的使用步骤: (1).首先添加一个conanfile.txt文件,内容如下:... -
conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义
2022-02-20 11:50:46上一篇博客《conan入门(八):交叉编译自己的conan包项目》中我们以jsonlib为例说明了如何将交叉编译自己封装成conan的模块。但是使用的DS-5 ARM的交叉编译器(`arm-linux-gnueabihf`)并不常见,也不方便读者实际操作。... -
conan入门(十三):conan info 命令的基本用法
2022-02-26 12:06:52conan info 命令的基本用法 conan info命令用于获取有关包的依赖关系图的信息。以thrift为例,如下查询thrift/0.13.0的依赖关系详情: $ conan info thrift/0.13.0@ boost/1.78.0 ID: ff68d7a235dfb0d14c40ddef58cc... -
conan 详解
2020-07-13 14:17:27conan Getting started 背景介绍 Conan是一个分散的包管理器,具有客户端 - 服务器架构。这意味着客户端可以从不同的服务器(“远程”)获取... -
conan使用(二)--conan环境搭建
2020-10-13 15:51:13其中渠道(Channel)用来描述是稳定版(Stable)还是测试版(Testing)等信息,以 boost 为例,我们可以看到这样的包名: boost/1.64.0@conan/stable boost/1.65.1@conan/stable boost/1.66.0@conan/stable boost/... -
conan入门(三):上传预编译的库(artifact)
2022-02-17 17:38:11conan 上传预编译的库(artifact) 我们经常需要从现有二进制文件创建包,比如第三方或供应商提供的C/C++库(只有include和lib),或在引入conan管理包之前手工编译编译好C/C++库。在这种情况下,我们并不需要conan从源... -
conan-c++包管理工具安装及使用指南
2021-04-04 14:42:05文章目录一、conan介绍1.1 简单介绍1.2 conna特点1.3 跨平台二、conan全平台安装三、使用conan教程四、快速总结conan 一、conan介绍 跨平台 c、c++包管理工具 python写的 开源 类似java的maven,python的pip 1.1 ... -
conan入门(十一):Linux下Android NDK交叉编译Boost
2022-02-25 15:14:02上一篇博客《conan入门(十):Windows下Android NDK交叉编译Boost》中已经说明了Windows下Android NDK交叉编译Boost的全过程。 本文在此基础上说明Linux下conan实现Android NDK交叉编译经常用到的的Boost库的过程。...