最新版のEOSをインストールしました。早速、スマートコントラクトを試作し、コンパイルするとエラーが出ました。
fatal error: ‘eosiolib/eosio.hpp’ file not found 。
ネットでいろいろ探しまして、解決方法がなさそうです。EOSを最インストールしても、解決できない。
自力しかないと覚悟してから、eosiocppファイルから調査を始めました。
1、ファイルの格納パス
eosiocppは下記二つ箇所に格納されています。
・XXXX/eos/build/tools/
・/usr/local/eosio/bin
中身が全く同じです。bashのスクリプトであり。
2、簡単に分析しましょう。
二行目の
EOSIO_BIN_INSTALL_DIR=’dirname $0′
を見た瞬間、EOSは大丈夫なの???
EOSのインストールパスの取得方法は意外にもコマンドの実行パスから判明するようです。
綺麗に直そうとしても、解決することを優先にして、パスをハードコーティングしました。
3、パスの取得方法を書き直す
EOSIO_BIN_INSTALL_DIRを使わず、捨てます。
EOSIO_INSTALL_DIRにEOSのインストールパスを直接に設定する。
#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=“/your eos install director/eos”
4、修正後のイメージ
直す方針が決めたら、コンパイルしながら、足りないライブラリや間違いパスなどどんどん直して、eosiocppは下記通りになりました。
ご注意:
個人環境のパスがいくつありまして、そのまま使えないです。
比較ツールを利用して、ローカルのをマージする必要。
#!/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}/build/programs/eosio-abigen/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}/contracts/libc++/upstream/include \
-extra-arg=-I${EOSIO_INSTALL_DIR}/contracts/musl/upstream/include \
-extra-arg=-I${BOOST_INCLUDE_DIR} \
-extra-arg=-I${EOSIO_INSTALL_DIR}/contracts \
-extra-arg=-I${EOSIO_INSTALL_DIR}/externals/magic_get/include \
-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