【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言

【内容简介】本文将从三部分手把手教大家如何在鲲鹏上使用编程语言:1、编写hello world,并在鲲鹏上运行;2、编写一个带cmake的标准跨平台C工程,完成软件在鲲鹏平台上的编译,安装功能;3、选择一种由C / C ++语言编写的跨平台开源软件Mysql,完成该软件的编译,安装,制作成可分发的替代。

正文开始

在鲲鹏上使用编程语言——C语言

这不是一个C语言的教程。

然后接下来的几期,主要介绍各种编程语言在鲲鹏上如何从二进制编译到二进制文件,从二进制文件编成一体,从软件包制作成码头工人或者VM一体的一系列实践。

由浅入深分三个部分

  • 编写一个经典的hello world,并在鲲鹏上运行起来
  • 编写一个带cmake的标准跨平台C工程,能完成软件在鲲鹏平台上的编译,安装功能
  • 选择一种由C / C ++语言编写的跨平台开源软件Mysql,完成该软件的编译,安装,制作成可分发的替代。

由于鲲鹏上主要能运行的操作系统都是Linux内核的,因此我们选择CentOS7.5作为讲解的代表。

编写一个经典的hello world,并在鲲鹏上运行起来

我们选择历史上最经典的Hello World,用来打印出hello world。

1 #include  <font></font>
2 main() {<font></font>
3    printf("hello world\n");<font></font>
4 }

登录鲲鹏开发环境

  1. 配置软件仓库
 1 # CentOS-Base.repo<font></font>
 2 #<font></font>
 3 # The mirror system uses the connecting IP address of the client and the<font></font>
 4 # update status of each mirror to pick mirrors that are updated to and<font></font>
 5 # geographically close to the client.  You should use this for CentOS updates<font></font>
 6 # unless you are manually picking other mirrors.<font></font>
 7 #<font></font>
 8 # If the mirrorlist= does not work for you, as a fall back you can try the<font></font>
 9 # remarked out baseurl= line instead.<font></font>
10 #<font></font>
11 #<font></font>
12  <font></font>
13 [base]<font></font>
14 name=CentOS-$releasever - Base - mirrors.huaweicloud.com<font></font>
15 baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/os/$basearch/<font></font>
16 #mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os<font></font>
17 gpgcheck=1<font></font>
18 gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7<font></font>
19  <font></font>
20 #released updates<font></font>
21 [updates]<font></font>
22 name=CentOS-$releasever - Updates - mirrors.huaweicloud.com<font></font>
23 baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/updates/$basearch/<font></font>
24 #mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates<font></font>
25 gpgcheck=1<font></font>
26 gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7<font></font>
27  <font></font>
28 #additional packages that may be useful<font></font>
29 [extras]<font></font>
30 name=CentOS-$releasever - Extras - mirrors.huaweicloud.com<font></font>
31 baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/extras/$basearch/<font></font>
32 #mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras<font></font>
33 gpgcheck=1<font></font>
34 gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7<font></font>
35 enabled = 1<font></font>
36  <font></font>
37 #additional packages that extend functionality of existing packages<font></font>
38 [centosplus]<font></font>
39 name=CentOS-$releasever - Plus - mirrors.huaweicloud.com<font></font>
40 baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/centosplus/$basearch/<font></font>
41 #mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus<font></font>
42 gpgcheck=1<font></font>
43 enabled=0<font></font>
44 gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7

安装C / C ++ 语言编译器

yum install gcc gcc-c++ libstdc++-devel

创建一个文件main.c,并编写hello world源代码

1 #include  <font></font>
2 main() {<font></font>
3    printf("hello world\n");<font></font>
4 }

为这个工程配置一个经典的Makefile。在工程目录下创建文件Makefile,并添加如下内容:

 1 default_target : all<font></font>
 2  <font></font>
 3 all:main.o<font></font>
 4 cc -o main main.o<font></font>
 5 main.o:<font></font>
 6 cc -c main.c<font></font>
 7 clean:<font></font>
 8 rm -r main *.o<font></font>
 9  <font></font>
10 install:all<font></font>
11 cp -f main /usr/bin

尝试使用make命令进行软件编译和安装,并做测试。

make && make install

编写一个带cmake的标准跨平台C工程,能完成软件在鲲鹏平台上的编译、安装功能

由于C语言编译器在不同平台上均不一样,使用方法也有或大或小的差异,通常我们要开发一款能够跨平台编译的软件,常用的工具就是cmake,cmake可以根据平台自动生成相应的Makefile文件。

我们首先为前文的hello world编写一个cmake文件,在工程的根目录下创建一个CMakeLists.txt

1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
2 PROJECT(hello_world)
3 AUX_SOURCE_DIRECTORY(. SRC_LIST)
4 ADD_EXECUTABLE(hello ${SRC_LIST})

在工程目录中创建一个cmake编译临时目录:

1 mkdir tmpbuild
2 cd tmpbuild

执行cmake

cmake ..

此时cmake会将makefile生成到这个临时目录里,直接执行make就可以开始编译了。

make

Q:为什么需要一个临时目录

A:因为cmake本身没有clean机制,会将临时文件、makefile等都放在工程下面。一个复杂工程通过cmake生成的临时文件目录结构非常复杂,通过手工无法清理。如果使用临时目录,当编译完成后,直接移除临时目录,就会重新得到一个干净无污染的代码工程。

选择一款由C/C++语言编写的跨平台开源软件Mysql,完成这个软件的编译、安装、制作成可分发的软件包。

Mysql5.7是一款C语言发开的跨平台开源软件的经典版本,他使用一套相同的核心源代码,即可完成在不同平台不同操作系统的软件编译和安装。同样mysql也是利用cmake来管理软件的跨平台能力。

我们先讲如何从源码生成在鲲鹏平台上可以运行的mysql软件,不感兴趣的小伙伴可以直接往后阅读,直接找到如何制作一个鲲鹏平台上的mysql软件包。

当然为满足大部分用户的直接诉求,大量开源软件都可以直接在华为镜像源上下载二进制包,这些二进制包由华为云鲲鹏编译制作,并完成最终测试。

安装gcc7.3,由于CentOS默认的gcc4.8.5有Bug(实际5.0已经修复),无法完成Mysql5.7,我们需要先为机器准备gcc7.3版本。

具体Bug可以参考gnu对的patch说明https://gcc.gnu.org/ml/gcc-cvs/2014-11/msg00084.html

  1. 为了安装非默认版本的软件,需要安装CentOS软件集管理
sudo yum -y install centos-release-scl

实际上会在/etc/yum.repos.d/下生成两个文件CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.repo

2. 其中,CentOS-SCLo-scl.repo的镜像源对aarch64的平台无效,我们需要将这个文件移除。

1 mv /etc/yum.repos.d/CentOS-SCLo-scl.repo /etc/yum.repos.d/CentOS-SCLo-scl.repo.ignore
2 sudo yum makecache
3 sudo yum install devtoolset-7-gcc* libatomic

遇到输入

Is this ok [y/d/N]:

时按y。

3. 安装完成后,我们就可以通过命令为bash运行环境临时配置环境变量,使此时的gcc、g++、include、lib等目录都切换为gcc7.3版本

scl enable devtoolset-7 bash

进入mysql5.7软件安装过程:

1. 下载软件源码包,这个包在华为云开源镜像站mirros.huaweicloud.com上可以找到,用于加速下载。

1 wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-boost-5.7.25.tar.gz
2 wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.25.tar.gz

2. 解压软件包

1 tar zxvf mysql-5.7.25.tar.gz
2 tar zxvf mysql-boost-5.7.25.tar.gz

3. 在当前环境临时激活gcc7.3

scl enable devtoolset-7 bash

4. 创建编译临时目录

1 mkdir tmpbuild
2 cd tmpbuild

5. 执行Cmake

cmake .. -DWITH_BOOST=../boost/boost_1_59_0 -DEXTRA_CHARSETS=all -DCMAKE_BUILD_TYPE=Release

6. 编译

make -j8

由于我们在Cmake阶段并没有指定安装属性,那么我们执行make install时会被安装到默认路径下。具体的详细的安装参数的配置可以参考mysql官方文档。下面给一个常见的样例。

cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_BOOST=../boost/boost_1_59_0/

一个全新的问题来了,如果我有100台服务需要部署,难道我需要编译100次源代码吗?

软件的最终目的都是为了分发和使用,我们需要制作出可以快速分发的软件包。

其实绝大多数软件都提供了可分发包的制作工具,比如mysql5.7就提供了mysql-community-5.7.25-1.el7.src.rpm这样的源码和工具的整合包,用于给CentOS7、redhat7这类操作系统制作可快速分发的二进制软件包。我们现在就开始制作:

1. 下载源码和工具的整合包

wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-community-5.7.25-1.el7.src.rpm

2. 安装工具包和一些依赖

1 sudo yum -y install perl perl-JSON perl-Data-Dumper perl-Env
2 sudo yum -y install cyrus-sasl-devel
3 sudo yum -y install libaio-devel
4 sudo yum -y install numactl-devel
5 sudo yum -y install openldap-devel
6 sudo yum -y install rpcgen
7 sudo yum -y install libtirpc-devel
8 sudo yum -y install ncurses-devel

安装rpmbuild工具

1 sudo yum -y install rpm-build

安装源码和工具整合包

sudo rpm -ivh mysql-community-5.7.25-1.el7.src.rpm

3. 切换到gcc7.3,执行rpmbuild二进制

sudo scl enable devtoolset-7 ‘rpmbuild -bb /root/rpmbuild/SPECS/mysql.spec‘

4. 最后编译出来的二进制都存放在路径/root/rpmbuild/RPMS/aarch64/下

5. 直接使用这些rpm软件包,就可以快速在多台的OS为CentOS7的鲲鹏实例上部署mysql了。

sudo yum install mysql-community-server* mysql-community-common* mysql-community-client* mysql-community-libs*

6. 启动mysql服务,并尝试用客户端和初始密码登录mysql。

1 sudo systemctl enable mysqld
2 sudo systemctl start mysqld

对于Ubuntu18.04,制作二进制的deb包会稍微区别。

  1. 下载源码和debian规则包的整合工具包。
wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-community-source_5.7.25-1ubuntu18.04_amd64.deb

由于社区提供的二进制包没有arm64版本的,因此我们先下载amd64版本的。

2. 安装编译用的软件依赖

apt-get install libaio-dev libjson-perl libldap2-dev libsasl2-dev zlib1g-dev po-debconf libnuma-dev libmecab-dev dh-apparmor dh-systemd

3. 下载并解压存放boost

1 wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-boost-5.7.25.tar.gz
2 mkdir -p /usr/global/share
3 tar zxvf mysql-boost-5.7.25.tar.gz
4 cp -r mysql-5.7.24/boost/boost_1_59_0/boost /usr/global/share/

4. 先把软件包解压到临时目录,其中mysql-source-build就是我们自定义的临时目录

dpkg -x mysql-community-source_5.7.25-1ubuntu18.04_amd64.deb mysql-source-build

5. 在临时目录中解压源代码压缩包和debian规则包

1 cd mysql-source-build/usr/src/mysqltar zxvf mysql-community_5.7.25.orig.tar.gz  #mysql源代码包重命名为debian规范
2 tar Jxvf mysql-community_5.7.25-1ubuntu18.04.debian.tar.xz  #mysql对应的debian打包规则
3 cd mysql-5.7.25/
4 cp -r ../debian .

6. 执行命令编译出包,-b代表只出二进制包

dpkg-buildpackage -rfakeroot -us -uc -b

所有的包会放在路径mysql-source-build/usr/src/mysql下,并以.deb作为软件包的扩展名。

7. 在Ubuntu18.04上安装打包完成的软件

1 dpkg -i mysql-common_5.7.25-1ubuntu18.04_arm64.deb
2 dpkg -i mysql-client_5.7.25-1ubuntu18.04_arm64.deb
3 dpkg -i mysql-server_5.7.25-1ubuntu18.04_arm64.deb

弹出窗口提示输入数据库的密码(不是OS的root密码):

8.安装完成后,登录数据库。

mysql -u root -p

作者:太一

原文地址:https://www.cnblogs.com/huaweicloud/p/12384762.html

时间: 2024-08-11 04:59:34

【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言的相关文章

揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术【华为云技术分享】

2019年5月,华为云发布全球首个基于自研ARM架构的分布式缓存鲲鹏Redis,搭载华为LibOS+华为编译器+安全容器引擎三项黑科技,在保证Redis强劲高性能外,还降低客户30%的使用成本,真正实现了好用不贵的普惠型分布式缓存Redis产品. 本文从技术视角解读华为云鲲鹏Redis是如何通过数据中心基础设施.芯片.硬件.软件等全栈创新优化,达成以上效果. 一.为什么ARM架构适合Redis? 众所周知,Redis是一款风靡全球的高性能.高灵活性.数据结构类型丰富的key-value内存数据库

王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019【华为云技术分享】

演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019)在北京举办.在计算机视觉技术专题,华为云OCR人工智能高级算法工程师王晶分享了“文字识别服务的技术实践.底层框架及应用场景”的主题演讲. 演讲的第一部分,他分享了文字检测和识别的基础知识以及难点和最新进展.第二部分是华为云文字识别服务关键能力.关键技术,以及落地过程中遇到的“坑”,这对其他人工智能产

【华为云技术分享】如何设计高质量软件-领域驱动设计DDD(Domain-Driven Design)学习心得

DDD做为软件设计方法于2004年提出,一直不温不火,最近几年突然火起来了,为啥呢?正所谓机会给有准备的人,因为微服务的流行,大家都跃跃欲试把传统单体软件转成微服务架构,但理论很丰满,现实很骨感,光是分解微服务就让人找不到北,而DDD是歪打正着也好,富有远见也好,正好适合微服务转型设计,不火都难. 最近学习了领域驱动设计(Domain-Driven Design),感觉受益匪浅,那到底啥是DDD呢?这里分享一下学习心得.网上有很多详细的资料,感兴趣可以看看这个https://www.infoq.

【华为云技术分享】技术探秘:华为云瑶光何以定方向

作为北斗第七星,瑶光自古就可用来判断四季更迭.引向定时.而作为全新发布的智能云操作系统,瑶光智慧云脑又是如何做到统领云上各类资源.实现租户需求与资源供应之间最佳匹配的呢?在华为云瑶光实验室.华为云算法创新实验室里,我们找到了答案. #初识资源调度# 云OS:我太“南”了 依托虚拟化技术,我们得以将数据中心海量的计算.存储资源以云服务的形式对外提供.而随着数据中心规模扩展.边缘计算带来的算力延伸,承担着高效.精准资源调度的云操作系统面临着三大挑战: 第一个挑战是云计算的资源消耗/售卖模式带来的.云

【华为云技术分享】大数据容器化,头部玩家尝到了甜头

[摘要] 大数据容器化,大势所趋.头部玩家在进行大数据容器化后,尝到了甜头? 大数据的需求热度,从来都是这个时代的浪尖.然而由于大数据系统的复杂性,一度导致业界大数据已死的各种声音不断.尤其是当MapR被HPE收购,Cloudera公司股票持续跌成狗,使得这种声音进一步放大.其实,大数据的需求一直在,只是传统的大数据实现系统需要考虑重新构建.而容器依靠其自身的标准化,一次构建,随处运行的能力,使得非常适合大数据系统的构建和管理.容器技术当前正是那只火遍全球的当红辣子鸡. 1 华为云BigData

【华为云技术分享】漫谈LIteOS-物联网操作系统介绍

[摘要] 本文主要对于目前物联网操作系统的定义以及主要特点进行了分析,最后介绍了几个常见的物联网操作系统. 1简介 提到操作系统,可能首先想到的就是苹果操作系统,windows,Linux,Unix,Android,IOS等,显然目前比较为人熟知的操作系统基本都是一些手机或者电脑端的操作系统.而随着互联网技术的不断发展,硬件的体积越来越小,物联网技术也迎来了爆棚式的发展.物理网不同于 互联网的不同在于后者更关注的是人与人的互联,而前者是更加强调人与物,物与物的连接,从而实现万物互联(IOT).显

华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】

1 文章目的 本文主要帮助已经掌握或者想要掌握Git的开发者,如何更好的应用Git,以及更好的将Git与DevCloud结合应用. 2 概述 2.1 版本控制系统介绍 从狭义上来说,版本控制系统是软件项目开发过程中管理代码所有修订版本的软件,能够存储.追踪文件的修改历史,记录多个版本的开发和维护,事实上我们可以将任何对项目有帮助的文档交付版本控制系统进行管理.版本控制系统(Version Control Systems)主要分为两类,集中式和分布式. 2.1.1 集中式版本控制系统 集中式版本控

【我的物联网成长记3】如何开发物联网应用?【华为云技术分享】

[摘要] 物联网应用是设备管理.故障监测.数据分析的重要工具.本文介绍如何基于物联网平台开发应用,包括API.SDK和图形化开发三种方式. -------------------整体方案------------------- 物联网应用是企业和开发者进行设备管理.告警&故障监测.业务监控.数据分析的重要工具.物联网平台屏蔽了设备接入的复杂性和协议的差异性,解耦应用与设备,为上层应用提供统一格式的数据,简化终端厂商开发的同时,也让应用提供商聚焦于自身的业务开发.基于华为物联网平台的应用开发方案如下

华为云流媒体性能测试解决方案 轻松应对流量危机【华为云技术分享】

背景 随着带宽提速和互联网发展,内容丰富.形式多样的视频正成为碎片化时代娱乐消费的新宠,短视频.视频直播.在线钢琴陪练.合唱直播一系列新玩法层出不穷,涉及电竞.社交.电商.教育等各个行业.网络视频快速发展对系统性能带来了巨大的考验. 流媒体业务场景 下面是用户与流媒体服务器的简化交互关系,主要分为推流和拉流2大类. 推流就是从外界采集数据后利用流媒体协议将文件推流至流媒体服务器端,拉流就是将文件从流媒体服务器拉取至本地播放的过程,流媒体的文件主要是由音频和视频2个部分组成,youtube.土豆.