新版的EOS,安装后,合约编译出现找不到h文件的错误。
eos编译成功以后eosiocpp存在与两个地方。
1, 下载到本地的EOS 目录下。 XXXXX/eos/build/tools/
2, 安装目录下。 /usr/local/eosio/bin
我尝试修改了 /usr/local/eosio/bin, 如果不想一级级的引用去执行编译合约可对eosiocpp 建立一个软链接, 因为网上有人说可能导致的问题, 其实不然, 当然依然可以建立一个, 毕竟方便使用 ln -s /usr/loacl/eosio/bin/eosiocpp /usr/local/bin/eosiocpp
下面是我进行修改的一些地方
说明: EOSIO_INSTALL_DIR = 自己编译安装的目录
BOOST_INCLUDE_DIR = eos的boost库目录, 其他的基本都需要去eos的安装目录设置
#!/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/aries/blockChain/eos
ABIGEN=${EOSIO_INSTALL_DIR}/build/programs/eosio-abigen/eosio-abigen
#BOOST_INCLUDE_DIR=/root/opt/boost/include
BOOST_INCLUDE_DIR=/home/aries/opt/boost/include
function copy_skeleton {
set -e
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; /root/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; /root/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; /root/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
网友评论