建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

太一

发帖: 8粉丝: 5

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2019-7-9 12:38:45 2249 3 楼主 显示全部楼层
[新手课堂] 【Hello,鲲鹏】第三期:在鲲鹏上使用编程语言——C语言

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

 

上一期我们介绍了,如何创建一个自己的开发者环境。那么接下来的几期,主要介绍各种编程语言在鲲鹏上如何从源码编译到二进制文件,从二进制文件编成软件包,从软件包制作成docker镜像或者VM镜像的一系列实践。

 

由浅入深分三个部分

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

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

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

 

 

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

 

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

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

#include  
main() {
   printf("hello world\n");
}



  1. 登录鲲鹏开发环境。

  2. 配置软件仓库

  3. # 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


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

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


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

  7. #include  
    main() {
       printf("hello world\n");
    }
  8. 使用gcc编译出一个可执行程序,并执行

  9. image.png

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

  11. 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



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

  13. 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软件集管理

  2. sudo yum -y install centos-release-scl


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

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

  4. 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

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

  6. scl enable devtoolset-7 bash



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

 

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

  2. 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
  3. 解压软件包

  4. tar zxvf mysql-5.7.25.tar.gz
    tar zxvf mysql-boost-5.7.25.tar.gz
  5. 在当前环境临时激活gcc7.3

  6. scl enable devtoolset-7 bash


  7. 创建编译临时目录

  8. mkdir tmpbuild
    cd tmpbuild


  9. 执行Cmake

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


  11. 编译

  12. 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. 下载源码和工具的整合包

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


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

  4. 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
  5. 切换到gcc7.3,执行rpmbuild二进制

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

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

  8. image.png

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

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

    image.png

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

  12. sudo systemctl enable mysqld
    sudo systemctl start mysqld

    image.png


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

  1. 下载源码和debian规则包的整合工具包。

  2. wget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-community-source_5.7.25-1ubuntu18.04_amd64.deb


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

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

  4. apt-get install libaio-dev libjson-perl libldap2-dev libsasl2-dev zlib1g-dev po-debconf libnuma-dev libmecab-dev dh-apparmor dh-systemd
  5. 下载并解压存放boost

  6. 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/
  7. 先把软件包解压到临时目录,其中mysql-source-build就是我们自定义的临时目录

  8. dpkg -x mysql-community-source_5.7.25-1ubuntu18.04_amd64.deb mysql-source-build
  9. 在临时目录中解压源代码压缩包和debian规则包

  10. 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 .
  11. 执行命令编译出包,-b代表只出二进制包

  12. dpkg-buildpackage -rfakeroot -us -uc -b

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

    image.png


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

  14. 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

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

  16. mysql -u root -p

    image.png

举报
分享

分享文章到朋友圈

分享文章到微博

蓝书签

发帖: 57粉丝: 16

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2019-7-26 17:05:20 沙发 显示全部楼层

学习一下

点赞 回复 举报

x88484532

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-10 13:13:48 板凳 显示全部楼层

不错,学习了

点赞 回复 举报

summer_1

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于3 天前 地板 显示全部楼层

初学者。

点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册