• 修正了一个不能生成abi文件的笔误。

  • 无法生成ADI的问题,也做了修改。

  • 写了一个稍微有说明的,希望能帮到你。 https://eosfans.strahe.com/topics/1092

  • 我也遇到了这样的问题,网上很多人问,但好像没有解决的方法。我用EOS根目录下面的sh批处理,重新安装EOS,也没有解决。最后,用暴力的方式解决的。就是改写,eosiocpp.sh

    我把我改写后的贴到下面,你对照着该一下,应该可以解决。(原来的目录取得处理逻辑太差了。)

    #!/bin/bash
    
    #EOSIO_BIN_INSTALL_DIR=`dirname $0`
    #if [ "${EOSIO_BIN_INSTALL_DIR}" == "." ]; then
    #  EOSIO_BIN_INSTALL_DIR=`pwd`
    #fi
    #EOSIO_INSTALL_DIR=`dirname ${EOSIO_BIN_INSTALL_DIR}`
    EOSIO_INSTALL_DIR="/home/yaoyh/app/eos"
    
    echo $EOSIO_INSTALL_DIR
    
    ABIGEN=${EOSIO_INSTALL_DIR}/bin/eosio-abigen
    BOOST_INCLUDE_DIR=/home/yaoyh/opt/boost/include
    function copy_skeleton {
        set -e
    #    cp -r "${EOSIO_INSTALL_DIR}/share/eosio/skeleton/." $newname
        cp -r "${EOSIO_INSTALL_DIR}/contracts/skeleton/." $newname
    
        for file in $(find ./$newname -name 'skeleton.*')
        do
            newfile=`echo $file | sed 's/skeleton\./'"$newname"'./'`
    #        echo mv "${file}" "${newfile}"
            mv "${file}" "${newfile}"
            exp=s/skeleton/${newname}/g
    #        echo sed -i ${exp}  ${newfile}
            sed ${exp}  ${newfile} > ${newfile}1
            mv ${newfile}1 ${newfile}
        done
        echo "created $newname from skeleton"
        set +e
    }
    
    function build_contract {
        set -e
        workdir=`mktemp -d`
    
        if [[ ${VERBOSE} == "1" ]]; then
           PRINT_CMDS="set -x"
        fi
    
        ($PRINT_CMDS; mkdir $workdir/built)
    
        for file in $@; do
            name=`basename $file`
            filePath=`dirname $file`
    
            ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/clang -emit-llvm -O3 --std=c++14 --target=wasm32 -nostdinc \
                                       -DBOOST_DISABLE_ASSERTS -DBOOST_EXCEPTION_DISABLE \
                                       -nostdlib -nostdlibinc -ffreestanding -nostdlib -fno-threadsafe-statics -fno-rtti \
                                       -fno-exceptions -I ${EOSIO_INSTALL_DIR}/include \
                                       -I${EOSIO_INSTALL_DIR}/contracts/libc++/upstream/include \
                                       -I${EOSIO_INSTALL_DIR}/contracts/musl/upstream/include \
                                       -I${BOOST_INCLUDE_DIR} \
                                       -I $filePath \
                                       -I${EOSIO_INSTALL_DIR}/contracts \
                                       -I${EOSIO_INSTALL_DIR}/externals/magic_get/include \
                                       ${EOSIOCPP_CFLAGS} \
                                       -c $file -o $workdir/built/$name
            )
    
        done
    
        ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/llvm-link -only-needed -o $workdir/linked.bc $workdir/built/* \
                                       ${EOSIO_INSTALL_DIR}/build/contracts/eosiolib/eosiolib.bc \
                                       ${EOSIO_INSTALL_DIR}/build/contracts/libc++/libc++.bc \
                                       ${EOSIO_INSTALL_DIR}/build/contracts/musl/libc.bc
    
    
        )
        ($PRINT_CMDS; /home/yaoyh/opt/wasm/bin/llc -thread-model=single --asm-verbose=false -o $workdir/assembly.s $workdir/linked.bc)
        ($PRINT_CMDS; ${EOSIO_INSTALL_DIR}/build/externals/binaryen/bin/eosio-s2wasm -o $outname -s 16384 $workdir/assembly.s)
        ($PRINT_CMDS; ${EOSIO_INSTALL_DIR}/build/libraries/wasm-jit/Source/Programs/eosio-wast2wasm $outname ${outname%.*}.wasm -n)
    
        ($PRINT_CMDS; rm -rf $workdir)
        set +e
    }
    
    function generate_abi {
    
        if [[ ! -e "$1" ]]; then
            echo "You must specify a file"
            exit 1
        fi
    
        context_folder=$(cd "$(dirname "$1")" ; pwd -P)
    
        ${ABIGEN} -extra-arg=-c -extra-arg=--std=c++14 -extra-arg=--target=wasm32 \
            -extra-arg=-nostdinc -extra-arg=-nostdinc++ -extra-arg=-DABIGEN \
            -extra-arg=-I${EOSIO_INSTALL_DIR}/include/libc++/upstream/include \
            -extra-arg=-I${EOSIO_INSTALL_DIR}/include/musl/upstream/include \
            -extra-arg=-I${BOOST_INCLUDE_DIR} \
            -extra-arg=${EOSIOCPP_CFLAGS}  \
            -extra-arg=-I${EOSIO_INSTALL_DIR}/include -extra-arg=-I$context_folder \
            -extra-arg=-fparse-all-comments -destination-file=${outname} -verbose=0 \
            -context=$context_folder $1 --
    
        if [ "$?" -ne 0 ]; then
            exit 1
        fi    
    
        echo "Generated ${outname} ..."
    }
    
    function print_help {
        echo "Usage: $0 -o output.wast contract.cpp [other.cpp ...]"
        echo "       OR"
        echo "       $0 -n mycontract"
        echo "       OR"
        echo "       $0 -g contract.abi types.hpp"
        echo
        echo "Options:"
        echo "   -n | --newcontract [name]"
        echo "      Create a new contract in the [name] folder, based on the example contract"
        echo "   OR"
        echo "   -o | --outname [output.wast] [input.cpp ...]"
        echo "      Generate the wast output file based on input cpp files"
        echo "      The wasm output will also be created as output.wasm"
        echo "   OR"
        echo "   -g | --genabi contract.abi types.hpp"
        echo "      Generate the ABI specification file [EXPERIMENTAL]"
    }
    
    command=""
    
    while [[ $# -gt 1 ]]
    do
    key="$1"
    
    case $key in
        -h|--help)
            print_help
            break;
            ;;
        -n|--newcontract)
            newname="$2"
            command="newcontract"
            shift 2
            break
            ;;
        -o|--outname)
            outname="$2"
            command="outname"
            shift 2
            break
            ;;
        -g|--genabi)
            outname="$2"
            command="genabi"
            shift 2
            ;;
        *)
            echo "Unrecognized option: $1"
            exit 1
            ;;
    esac
    done
    
    if [[ "outname" == "$command" ]]; then
        build_contract $@
    elif [[ "newcontract" == "$command" ]]; then
        copy_skeleton
    elif [[ "genabi" == "$command" ]]; then
        generate_abi $@
    else
        print_help
        exit 1
    fi
    
  • 多谢补充。