热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言,Go语言社区,Golang程序员人脉社

【内容简介】本文将从三部分手把手教大家如何在鲲鹏上使用编程语言: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。

#include  
main() {
   printf("hello worldn");
}

登录鲲鹏开发环境

  1. 配置软件仓库

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-$releasever - Base - mirrors.huaweicloud.com
baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/os/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7
 
#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.huaweicloud.com
baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/updates/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.huaweicloud.com
baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/extras/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=https://mirrors.huaweicloud.com/centos-altarch/RPM-GPG-KEY-CentOS-7
enabled = 1
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.huaweicloud.com
baseurl=https://mirrors.huaweicloud.com/centos-altarch/$releasever/centosplus/$basearch/
#mirrorlist=https://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
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源代码

#include  
main() {
   printf("hello worldn");
}

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

default_target : all
 
all:main.o
cc -o main main.o
main.o:
cc -c main.c
clean:
rm -r main *.o
 
install:all
cp -f main /usr/bin

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

make && make install

image.png

image.png

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

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

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

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(hello_world)
AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_EXECUTABLE(hello ${SRC_LIST})

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

mkdir tmpbuild
cd tmpbuild

执行cmake

cmake ..

image.png

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

make

image.png

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的平台无效,我们需要将这个文件移除。

mv /etc/yum.repos.d/CentOS-SCLo-scl.repo /etc/yum.repos.d/CentOS-SCLo-scl.repo.ignore
sudo yum makecache
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上可以找到,用于加速下载。

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

2. 解压软件包

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

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

scl enable devtoolset-7 bash

4. 创建编译临时目录

mkdir tmpbuild
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. 安装工具包和一些依赖

sudo yum -y install perl perl-JSON perl-Data-Dumper perl-Env
sudo yum -y install cyrus-sasl-devel
sudo yum -y install libaio-devel
sudo yum -y install numactl-devel
sudo yum -y install openldap-devel
sudo yum -y install rpcgen
sudo yum -y install libtirpc-devel
sudo yum -y install ncurses-devel

安装rpmbuild工具

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/下

image.png

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

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

image.png

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

sudo systemctl enable mysqld
sudo systemctl start mysqld

image.png

对于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

wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-boost-5.7.25.tar.gz 
mkdir -p /usr/global/share
tar zxvf mysql-boost-5.7.25.tar.gz 
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规则包

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

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

dpkg-buildpackage -rfakeroot -us -uc -b

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

image.png

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

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

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

image.png

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

mysql -u root -p

image.png

作者:太一


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
author-avatar
不如藏拙_487
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有