zoukankan      html  css  js  c++  java
  • PGI安装时出现ERROR: unknown glibc version (2.4),的解决方法

    本人在安装PGI时出现ERROR: unknown glibc version (2.4)的错误,经过网友的指教,终于成功完成安装。

    看着PGI能顺利工作,心里确实很爽,在这里也把自己的一点所获与大家分享。

           以本人所用的PGI-7.1.4为例,第一次安装后出现上述错误,但是发现此时PGI文件已经被成功写入指定的区域了,然后在安装路径下(本人使用/home/name/pgi/)下找到/linux86/7.1/中的makelocal文件,打开后按以下方式更改:

        修改后的makelocalrc如下(修改部分已用整行长注释条标出):

    #! /bin/sh
    ##
    ## Copyright 1990-2000, The Portland Group, Incorporated.
    ## Copyright 2000-2005, STMicroelectronics, Incorporated.
    ## All rights reserved.
    ##
    ## STMICROELECTRONICS, INCORPORATED PROPRIETARY INFORMATION
    ## This software is supplied under the terms of a license agreement
    ## or nondisclosure agreement with STMicroelectronics and may not be
    ## copied or disclosed except in accordance with the terms of that
    ## agreement.
    ##

    # Just in case
    PATH=/usr/bin:/bin:$PATH
    TMPDIR=${TMPDIR:-/tmp}

    usage() {
    echo "Usage: $0 [-x|-n] installdir"
    echo
    echo "Example: $0 -x /usr/pgi/linux86/6.1"
    quit 1
    }

    quit() {
    # Cleanup scratch files.
    rm -rf $scratch
    exit $1
    }

    copy_files() {
    # $1 is source dir, $2 is destination dir
    if test -n "$1"; then
    if test -d "$1"; then
    if test ! -d $2 ; then
    mkdir $2
    fi
    ( cd $1 ; tar cf - * | ( cd $2; tar xpf - ))
    fi
    fi
    }

    pretty_print() {
    echo $@ | awk -F^ '{printf("%20-s %s ",$1,$2);}'
    }

    print_line() {
    echo $1 $2 $3 $4 $5 $6 >> $newrc
    }

    get_glibc_version() {
    # Determine the GNU LIBC version.

    if test -r /lib64/libc.so.6 ; then
    LIBC=/lib64/libc.so.6 # should only exist on a 64-bit Linux OS.
    elif test -r /lib/libc.so.6 ; then
    LIBC=/lib/libc.so.6 # should exist on any Linux OS.
    else
    echo "ERROR: /lib/libc.so.6: not found or no read permission"
    quit
    fi

    x=`strings $LIBC | grep 'GNU C Library' | cut -d, -f1 | awk '{print $7}'`
    if test -n "$x" ; then
    #########################################################################################
    GLIBC_VERSION=2.4.4 ##原来是"$x"
    else
    GLIBC_VERSION=2.4.4 ##原来是空的
    ########################################################################################
    fi
    unset x
    return
    }

    get_linker_version() {
    x=`grep collect2 $out | sed q | sed -e 's/.* -dynamic-linker //' -e 's/ .*//'`
    if test -n "$x" ; then
    LINKER=$x
    else
    LINKER=
    fi
    unset x
    return
    }

    get_specs_file() {
    # This command pipeline should be I18N-capable.
    x=`awk '/gcc.*specs/ {print $NF}' $out`
    if test -n "$x" ; then
    SPECSFILE=$x
    else
    SPECSFILE=
    fi
    unset x
    return
    }

    # Stop if not Linux.

    opsys=`uname -s | tr '[A-Z]' '[a-z]'`
    if test "$opsys" != "linux" ; then
    echo
    echo "$0: `uname -n` is not running Linux"
    quit 1
    fi

    pgi50=1
    noexec=1
    ofile=0
    use_pthreads=1
    no_m32_support=0
    check_crt_files=0
    set_hammer_empty=0
    gcc=gcc
    g77=g77
    scratch=$TMPDIR/PGI-INSTALL.$$
    if test ! -d $scratch ; then
    mkdir $scratch
    fi

    while test -n "$1"; do
    case $1 in
    -n ) noexec=1 ;;
    -x ) noexec=0 ;;
    -o ) ofile=1 ; noexec=0 ;;
    -gcc ) shift; gcc=$1 ;;
    -g77 ) shift; g77=$1 ;;
    * ) start=$1 ;;
    esac
    shift
    done

    if test -z "$start" ; then
    usage
    fi

    if test ! -d $start ; then
    echo "$0: $start: directory not found"
    usage
    fi

    if test "$start" = "." ; then
    start=`pwd`
    fi

    if test "$pgi50" -eq 1 ; then
    # Example: 5.0 and above:
    # start = /usr/pgi/linux86/5.0
    # installdir = /usr/pgi/linux86
    # version = 5.0
    # base = /usr/pgi/linux86/5.0
    # target = linux86
    installdir=`dirname $start`
    version=`basename $start`
    base=$start
    target=`basename $installdir`
    else
    # Example: 4.1 and below:
    # start = /usr/pgi
    # installdir = /usr/pgi
    # base = /usr/pgi/linux
    # version = 5.0
    # target = linux86
    installdir=$start
    version=`cat $start/.release`
    base=$start/linux86
    target="linux86"
    fi

    # Define target-specific options needed below.

    arch=`uname -m`
    case "${target}:${arch}" in
    linux86:x86_64 )
    gccopt="-o $scratch/a.out -m32 -v"
    g77opt=$gccopt
    subdir="/32"
    check_crt_files=1
    use_64bit_rcfiles=11
    install_64_bit=0
    lib=/lib
    usrlib=/usr/lib
    ;;
    linux86:* )
    set_hammer_empty=1
    gccopt="-o $scratch/a.out -v"
    g77opt=$gccopt
    use_64bit_rcfiles=10
    install_64_bit=0
    lib=/lib
    usrlib=/usr/lib
    ;;
    linux86-64:x86_64 )
    gccopt="-o $scratch/a.out -v"
    g77opt=$gccopt
    lib=/lib64
    usrlib=/usr/lib64
    install_64_bit=1
    use_64bit_rcfiles=0
    ;;
    linux86-64:* )
    echo "ERROR: target doesn't match architecture"
    exit 1
    ;;
    esac

    localrc=$base/bin/localrc
    newrc=$scratch/localrc.$$

    # Find the version of GLIBC used on this system so that the appropriate
    # files are copied from lib-linux86-g* to lib and/or liblf.

    LIBC=$lib/libc.so.6
    if test ! -f $LIBC ; then
    echo "ERROR: file $LIBC: not found."
    quit 1
    fi

    get_glibc_version # sets GLIBC_VERSION

    case "$GLIBC_VERSION" in
    2.3.* )
    glibc=232
    LIB=$base/lib-linux86-g232
    LIBLF=$LIB-lf
    INC=$base/include-g23
    ;;
    2.2.9* )
    glibc=2293
    LIB=$base/lib-linux86-g2293
    LIBLF=$LIB-lf
    INC=$base/include-g222
    ;;
    2.2.5 )
    glibc=225
    LIB=$base/lib-linux86-g225
    LIBLF=$LIB-lf
    INC=$base/include-g222
    ;;
    2.2.4 )
    glibc=224
    LIB=$base/lib-linux86-g224
    LIBLF=$LIB-lf
    INC=$base/include-g222
    ;;
    2.2.2 )
    glibc=222
    LIB=$base/lib-linux86-g22
    LIBLF=$LIB-lf
    INC=$base/include-g222
    ;;
    2.1.9* | 2.2*)
    glibc=22
    LIB=$base/lib-linux86-g22
    LIBLF=$LIB-lf
    INC=$base/include-g22
    ;;
    2.1.[23] )
    glibc=212
    LIB=$base/lib-linux86-g212
    ;;
    2.1.1 )
    glibc=211
    LIB=$base/lib-linux86-g211
    ;;
    ####################################################################################
    2.4.4) ##这都是加上的 其实只要改GLIBC_VERSION
    glibc=232 ##对应上面半括号中较新版本版本号即可
    LIB=$base/lib-linux86-g232
    LIBLF=$LIB-lf
    INC=$base/include-g23
    ;;
    #####################################################################################
    * )
    echo "ERROR: unknown glibc version ($GLIBC_VERSION)."
    quit 1
    ;;
    esac

    # PGI software needs some of the gcc libraries. Run gcc to determine
    # to determine which linker and libraries are actually being used.

    type $gcc > /dev/null 2>&1
    if test $? -eq 1 ; then
    echo "ERROR: gcc not found;"
    echo " successful use of compilers requires existence of gcc libraries"
    quit 1
    fi

    cfile=$scratch/hello-$$.c
    ffile=$scratch/hello-$$.f

    cat > $cfile <<EOF_HELLO_C
    #include <stdio.h>
    #include <stdlib.h>
    main(){ printf("Hello world! "); exit(0); }
    EOF_HELLO_C

    cat > $ffile <<EOF_HELLO_F
    program hello
    write(*,100)
    100 format('Hello world!')
    end
    EOF_HELLO_F

    out=$scratch/gccrun.$$
    $gcc $gccopt $cfile > $out 2>&1

    if test ! -s $out ; then
    echo "ERROR: gcc failed to execute for reasons unknown."
    quit 1
    fi
    ########################################################################
    ####$gccbase=`$gcc -print-search-dirs | sed -e 's/^install: //' -e 1q`
    ####if test -d $gccbase$subdir ; then
    #### GCCDIR="$gccbase$subdir" ##原有的
    ####fi
    ####gccversion=`$gcc -dumpversion`
    #######################################################################
    libgcc=`$gcc -print-libgcc-file-name`
    gccbase=`dirname $libgcc`
    GCCDIR="$gccbase$subdir" ##自己加的
    gccversion=`basename $gccbase`

    ##########################################################################

    # Check and see whether directory that gcc claims to exist actually
    # does exist.

    if test ! -d $gccbase ; then
    echo "ERROR: directory $gccbase: not found;"
    echo " successful use of compilers requires existence of gcc libraries!"
    quit 1
    fi

    if test -d ${gccbase}include ; then
    GCCINC=${gccbase}include
    else
    unset GCCINC
    fi

    # Find the linker

    get_linker_version # returns LINKER
    if test ! -x $LINKER ; then
    echo "ERROR: Linker $LINKER: not found"
    quit 1
    fi

    # Which g77? PGI software needs the g77 libraries, so look for the g77 libs.

    type $g77 >/dev/null 2>&1
    if test $? -eq 1 ; then
    echo "WARNING: g77 not found; this may cause problems during use"
    G77DIR='""'
    else
    out=$scratch/g77run.$$
    $g77 $g77opt $ffile > $out 2>&1
    libgcc=`$g77 -print-libgcc-file-name`
    g77base=`$g77 -print-search-dirs | sed -e 's/^install: //' -e 1q`
    if test -d $g77base$subdir ; then
    G77DIR="$g77base$subdir"
    else
    G77DIR='""'
    fi
    f2c=`cat $out | grep lf2c`
    g2c=`cat $out | grep lg2c`
    if test -n "$f2c" ; then
    G77LIB="-lf2c"
    fi
    if test -n "$g2c" ; then
    G77LIB="-lg2c"
    fi
    fi

    if test -n "$G77LIB" ; then
    print_line "set LFC=$G77LIB;"
    fi

    # Which dynamic linker?

    if test "$LINKER" != "/lib/ld-linux.so.1" ; then
    print_line "set LDSO=$LINKER;"
    fi

    # CDK uses its own libmpich.a.

    if test -f "$base/bin/mpirun" ; then
    print_line "set MPILIB=$base/lib;"
    MPILIB=$base/lib/libmpich.a
    fi

    print_line "set GCCDIR=$GCCDIR;"
    print_line "set GCCINC=$GCCINC;"
    print_line "set G77DIR=$G77DIR;"

    #Add setaff_bind.o and -lnuma at link line
    x=$base
    x=`echo $x | sed -e 's/.*86-64.*/86-64/'`
    if test "$x" = "86-64" ; then
    if test -e $usrlib/libnuma.so ; then
    print_line 'set NUMAOBJS=$COMPLIBOBJ/setaff_bind.o;'
    print_line "set NUMALIBS=-lnuma;"
    fi
    fi

    if test $pgi50 -eq 0 ; then
    print_line "set STDRPATH=-rpath $PGI/linux86/lib;"
    fi

    print_line 'set LOCALRC=YES;'

    if test "$noexec" -eq 1 ; then
    pretty_print 'PGI directory' ^ $installdir
    pretty_print 'PGI version' ^ $version
    pretty_print 'PATH entry' ^ "$base/bin"
    pretty_print 'System linker' ^ $LINKER
    pretty_print 'GCC directory' ^ $GCCDIR
    pretty_print 'GCC headers' ^ $GCCINC
    pretty_print 'G77 directory' ^ $G77DIR
    pretty_print 'G77 headers' ^ $G77LIB

    if test -n "$GLIBC_VERSION" ; then
    pretty_print 'GNU C version' ^ $GLIBC_VERSION
    pretty_print 'PGI glibc libs' ^ $LIB
    pretty_print 'PGI glibc headers' ^ $INC
    else
    pretty_print 'Glibc version' ^ 'no'
    fi

    if test -n "$LIBLF" ; then
    pretty_print 'Large file support' ^ $LIBLF
    else
    pretty_print 'Large file support' ^ 'no'
    fi

    if test -n "$MPILIB" ; then
    pretty_print 'MPILIB' ^ $MPILIB
    fi

    if test $use_pthreads -eq 1 ; then
    pretty_print 'Threads' ^ "$usrlib/libpthread.{a,so}"
    else
    pretty_print 'Threads' ^ "$base/lib/libpgthread.{a,so}"
    fi

    if test $no_m32_support -eq 1 ; then
    pretty_print 'gcc supports -m32' ^ 'no'
    else
    pretty_print 'gcc supports -m32' ^ 'yes'
    fi

    quit 0
    fi

    # Make the necessary changes to meet glibc dependencies.

    if test -n "$glibc" ; then
    copy_files $LIB $base/lib

    case "$glibc" in
    22* | 23* )
    copy_files $INC $base/include
    print_line "set THROW=__THROW=;"
    ;;
    21* )
    ;;
    esac

    # Large file support.

    if test -n "$LIBLF" ; then
    copy_files $LIBLF $base/liblf
    else
    rm -rf $base/liblf
    fi

    # Newer distributions of Linux do not need PGI-compiled versions of
    # threads libraries.

    if test $use_pthreads -eq 1 ; then
    # Only create a symlink if the target file exists and
    # the link does not.
    if test -e $usrlib/libpthread.a ; then
    if test ! -h $base/lib/libpgthread.a ; then
    ln -s $usrlib/libpthread.a $base/lib/libpgthread.a
    fi
    fi
    if test -e $lib/libpthread.so.0 ; then
    if test ! -h $base/lib/libpgthread.so ; then
    ln -s $lib/libpthread.so.0 $base/lib/libpgthread.so
    fi
    fi
    fi

    # Adjust header files based on the gcc version.

    need_stddef=1
    case "$gccversion" in
    3.3* )
    copy_files $base/include-gcc33 $base/include
    ;;
    3.4* )
    copy_files $base/include-gcc34 $base/include
    need_stddef=0
    ;;
    4.* )
    copy_files $base/include-gcc40 $base/include
    need_stddef=1
    ;;
    * )
    ;;
    esac

    if test $need_stddef -eq 0 ; then
    rm -f $base/include/stddef.h
    fi

    # Changes for 32-bit installs.

    if test $set_hammer_empty -eq 1 ; then
    print_line "set HAMMER=;"
    print_line "set X86_64=;"
    fi

    if test $install_64_bit -eq 0 ; then
    if test -f /etc/redhat-release ; then
    grep 'release 9' /etc/redhat-release > /dev/null 2>&1
    if test $? -eq 0; then
    print_line "set LBSTAT=-lpthread -lpthread_nonshared;"
    fi
    fi
    fi

    # Stock distributions may need extra help in finding crt files.

    if test $check_crt_files -eq 1 ; then
    if test ! -f /usr/lib64/32/crt1.o ; then
    print_line "set DEFLIBDIR=/usr/lib;"
    print_line "set DEFSTDOBJDIR=/usr/lib;"
    print_line "set EXTRAASARGS=--32;"
    fi
    fi

    # For production installations, recover some space by unneeded files.

    if test "$version" != "dev" ; then
    rm -rf $base/include-g*
    echo $GLIBC_VERSION > $base/glibc_version
    fi

    # Fix the 32/64-bit .*rc files.

    if test $use_64bit_rcfiles -eq 11 ; then
    files=`ls -1 $base/bin/.pg*-64 2>/dev/null`
    for i in $files ; do
    x=`echo $i | sed -e 's/-64$//'`
    mv -f $i $x
    done
    rm -f $base/bin/.pg*-32 > /dev/null 2>&1
    elif test $use_64bit_rcfiles -eq 10; then
    files=`ls -1 $base/bin/.pg*-32 2>/dev/null`
    for i in $files ; do
    x=`echo $i | sed -e 's/-32$//'`
    mv -f $i $x
    done
    rm -f $base/bin/.pg*-64 > /dev/null 2>&1
    fi
    fi

    # Add timestamp and username.

    print_line '# makelocalrc executed by ' `whoami` `date`

    # If $ofile is set, then display the file to stdout. Otherwise, write
    # it to $localrc.

    if test $ofile -eq 1 ; then
    echo "##### localrc contents #####"
    cat $newrc
    echo "############################"
    rm -f $newrc
    else
    if test -f $localrc ; then
    mv -f $localrc $localrc.bak
    chmod -f 0644 $localrc.bak
    fi
    mv -f $newrc $localrc
    chmod -f 0644 $localrc
    fi

    # Copy omp_lib.mod from lib directory to include directory
    echo
    if test -f $base/lib/omp_lib.mod ; then
    cp -f $base/lib/omp_lib.mod $base/include/omp_lib.mod
    fi
    if test -f $base/lib/omp_lib_kinds.mod ; then
    cp -f $base/lib/omp_lib_kinds.mod $base/include/omp_lib_kinds.mod
    fi
    quit 0

    将此修改过的文件保存到另一位置,为下一步做好准备,在这里,重要的一点是要将此makelocal设置为可执行文件,否则重新安装后PGI在运行过程中会出现“需要运行makelocal来完成安装的提示”。然后用修改过的文件替换原始的解压缩后的PGI安装文件的相应的makelocal文件,重新安装PGI,就可以了!

    路漫漫其修远兮 吾将上下求索
  • 相关阅读:
    【NX二次开发】Block UI 组
    【NX二次开发】Block UI 双精度表
    【NX二次开发】Block UI 整数表
    自己写的简单的轮播图
    微信分享到朋友圈----摘录
    HTML5比较实用的代码
    苏格拉底的名言警句
    jQuery 幻灯片 ----摘录
    DeDe调用指定栏目ID下的文章
    JQuery 判断ie7|| ie8
  • 原文地址:https://www.cnblogs.com/hbmlml/p/4022573.html
Copyright © 2011-2022 走看看