月度归档:2017年10月

CentOS6系统”libc.so.6: version ‘GLIBC_2.15’ not found”解决方法

出现”libc.so.6: version ‘GLIBC_2.15’ not found”问题,是由于glibc版本过低,升级glibc即可。
可以将解决CentOS系统GLIBC_2.12版本低的问题
由于CentOS系统RPM源目前glibc最高版本是2.12,所以只能采用源码升级
一、查看系统glibc支持的版本

    strings /lib64/libc.so.6 |grep GLIBC  
    #查看当前glibc版本  
    ll /lib64/libc.so.6   
    lrwxrwxrwx. 1 root root 12 Oct  9  2014 /lib64/libc.so.6 -> libc-2.12.so  

二、下载glibc源码包

    cd /usr/src/  
    wget http://mirror.bjtu.edu.cn/gnu/glibc/glibc-2.15.tar.gz  
    wget http://mirror.bjtu.edu.cn/gnu/glibc/glibc-ports-2.15.tar.gz      #glibc插件  

三、解压安装升级glibc

    tar zxvf glibc-2.15.tar.gz  
    tar zxvf glibc-ports-2.15.tar.gz  
    mv glibc-ports-2.15 glibc-2.15/ports  
    mkdir build  
    cd build  
    ../glibc-2.15/configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin  
    make -j4  
    make install  

四、验证

查看当前系统glibc支持的版本

    strings /lib64/libc.so.6 |grep GLIBC  

五、误删libc.so.6解决办法

命令行执行如下:

LD_PRELOAD=/lib/libc-2.12.so ln -s /lib/libc-2.12.so lib/libc.so.6

来源:http://blog.csdn.net/hnhuangyiyang/article/details/50392997

实现C语言的继承和多态

较经典的动物世界中的实例来举例:
假设动物们(包括人)都会吃(Eat),会走(Walk),会说(Talk),而派生类为 dog(汪星人) 和 cat(喵星人),当然还可以是更多,dog 和 cat 都有自己独特的 eat, walk 和 talk 方式,那么大致的代码如下:
代码无警告编译运行

基类头文件

// animal.h
#ifndef ANIMAL_H__
#define ANIMAL_H__

typedef struct animal_s_ animal_t;
typedef struct animal_ops_s_ animal_ops_t;

struct animal_s_ {
        char *name;
        animal_ops_t *animal_ops;
};

struct animal_ops_s_ {
        void (*eat)(char *);
        void (*walk)(int);
        void (*talk)(char *);
};

animal_t *animal_init(char *name);

void animal_eat(animal_t *, char *food);
void animal_walk(animal_t *, int steps);
void animal_talk(animal_t *, char *msg);

void animal_die(animal_t *);

#endif//ANIMAL_H__

基类实现

// animal.c
#include <assert.h>
#include <stdlib.h>
#include <string.h>

#include "animal.h"

animal_t *animal_init(char *name)
{
        assert(name != NULL);
        size_t name_len = strlen(name);

        animal_t *animal = malloc(sizeof (*animal)
                + sizeof (animal_ops_t) + name_len + 1);
        memset(animal, 0, sizeof (*animal)
                + sizeof (animal_ops_t) + name_len + 1);
        animal->name = (char *)animal
                + sizeof (animal_t) + sizeof (animal_ops_t);
        memcpy(animal->name, name, name_len);
        animal->animal_ops = (animal_ops_t *)((char *)animal
                + sizeof (*animal));

        return animal;
}

void animal_eat(animal_t *animal, char *food)
{
        animal->animal_ops->eat(food);

        return;
}

void animal_walk(animal_t *animal, int steps)
{
        animal->animal_ops->walk(steps);

        return;
}

void animal_talk(animal_t *animal, char *msg)
{
        animal->animal_ops->talk(msg);

        return;
}

void animal_die(animal_t *animal)
{
        assert(animal != NULL);
        free(animal);

        return;
}

继续阅读

CentOS 6通过yum安装GCC4.7 4.8 4.9 5.3 6.3 7.3等高版本GCC

再说一下已经停止支持的devtoolset4(gcc 5.2)及之前版本的安装方法
gcc 4.7 安装

    wget http://people.centos.org/tru/devtools-1/devtools-1.repo -O /etc/yum.repos.d/devtoolset-1.repo
    yum install centos-release-scl
    yum install devtoolset-1-toolchain
    scl enable devtoolset-1 bash
    gcc --version

gcc 4.8 安装

curl -Lks http://www.hop5.in/yum/el6/hop5.repo > /etc/yum.repos.d/hop5.repo
yum install gcc gcc-g++
gcc --version

或者使用官方工具

    wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtoolset-2.repo
    yum install centos-release-scl
    yum install devtoolset-2-toolchain
    scl enable devtoolset-2 bash
    gcc --version

gcc 4.9 安装

    yum install centos-release-scl
    yum install devtoolset-3-toolchain
    scl enable devtoolset-3 bash
    gcc --version

gcc 5.3 安装

    yum install centos-release-scl
    yum install devtoolset-4-toolchain
    scl enable devtoolset-4 bash
    gcc --version

gcc 6.3 安装

    yum install centos-release-scl
    yum install devtoolset-6-toolchain
    scl enable devtoolset-6 bash
    gcc --version

gcc 7.3 安装

    yum install centos-release-scl
    yum install devtoolset-7-toolchain
    scl enable devtoolset-7 bash
    gcc --version

scl enable devtoolset-3 bash 只是临时覆盖系统原有的GCC引用,重启后恢复原来的GCC,如果想永久覆盖,
可在/etc/bashrc文件中添加

source /opt/rh/devtoolset-3/enable

或者:如果root单独使用,在/root/.bashrc文件中添加

source /opt/rh/devtoolset-3/enable

重启后生效。

文件参考: https://www.quyu.net/info/876.html
https://www.dwhd.org/20160724_085212.html