zoukankan      html  css  js  c++  java
  • 【鲲鹏来了】手把手教你在鲲鹏上使用编程语言——C语言

    转自鲲鹏社区

    请注意,这不是一个C语言的教程。

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

    由浅入深分三个部分

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

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

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

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

    1. 登录鲲鹏开发环境。
    2. 配置软件仓库

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

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

    5.使用gcc编译出一个可执行程序,并执行

     

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

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

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

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

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

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

    执行cmake

    此时cmake会将makefile生成到这个临时目录里,直接执行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说明 

    1.为了安装非默认版本的软件,需要安装CentOS软件集管理

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

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

    遇到输入

    时按y。

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

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

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

    2.解压软件包

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

    4.创建编译临时目录

    5.执行Cmake

    6.编译

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

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

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

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

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

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

    安装rpmbuild工具

    安装源码和工具整合包

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

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

     

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

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

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

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

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

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

    3.下载并解压存放boost

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

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

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

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

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

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

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

  • 相关阅读:
    Webpack打包原理
    Vue——VNode
    Vue——响应式原理
    HTTP2.0——头部压缩
    HTTP2.0
    浏览器打开2个页面会有几个进程?
    计算机网络——TCP如何保证可靠性
    操作系统——进程之间的通信
    前端路由hash与history下
    前端路由hash与history上
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165123.html
Copyright © 2011-2022 走看看