我已经制作了一个简短的脚本来交叉编译tensorflow并且在链接主机端的proto_text期间遇到链接器错误,但是我已经检查过并且我正在链接相应的库并且它似乎包含正确的符号(见下文)
版本:tensorflow @ tags / v1.4.0-rc1
这是我的交叉编译脚本(我无法获得默认的compile_nsync.sh脚本适合我的情况)
unset CC CXX AS AR
pushd tensorflow/contrib/makefile/downloads/nsync/builds/x86_64.linux.gcc
CC=gcc AR=ar CXX=g++ AS=as make clean VERBOSE=1
CC=gcc AR=ar CXX=g++ AS=as make depend VERBOSE=1
CC=gcc AR=ar CXX=g++ AS=as make VERBOSE=1
HOST_NSYNC_LIB="$(pwd)/nsync.a"
popd
export CXX=arm-linux-gnueabihf-g++-6
export CC=arm-linux-gnueabihf-gcc-6
export AR=arm-linux-gnueabihf-ar
export AS=arm-linux-gnueabihf-as
pushd tensorflow/contrib/makefile/downloads/nsync/tools
rm -rf ../builds/arm.linux.arm-linux-gnueabihf-gcc-6
sh mkmakefile.sh -arch arm -os linux -cc arm-linux-gnueabihf-gcc-6
popd
pushd tensorflow/contrib/makefile/downloads/nsync/builds/arm.linux.arm-linux-gnueabihf-gcc-6
make clean VERBOSE=1
#make depend VERBOSE=1
make VERBOSE=1
TARGET_NSYNC_LIB="$(pwd)/nsync.a"
popd
export HOST_NSYNC_LIB TARGET_NSYNC_LIB
echo "HOST nsync: $HOST_NSYNC_LIB"
echo "TARGET nsync: $TARGET_NSYNC_LIB"
make -j -f tensorflow/contrib/makefile/Makefile \
TARGET=LINUX CC_PREFIX="${CC_PREFIX}" \
HOST_CC=gcc HOST_CXX=g++ \
CXX=arm-linux-gnueabihf-g++-6 CC=arm-linux-gnueabihf-gcc-6 \
CXX_FLAGS="-mfpu=neon-vfpv4 -ftree-vectorize" \
HOST_NSYNC_LIB="$HOST_NSYNC_LIB" TARGET_NSYNC_LIB="$TARGET_NSYNC_LIB" \
SUB_MAKEFILES="${SUB_MAKEFILES}" ${EXTRA_MAKE_ARGS[@]}
暂停错误
.... /work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_obj/tensorflow/core/grappler/costs/op_performance_data.pb.o -L/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/protobuf-host/lib -L/usr/local/lib /work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/downloads/nsync/builds/x86_64.linux.gcc/nsync.a -lstdc++ -lprotobuf -lpthread -lm -lz -ldl -lpthread
/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_obj/tensorflow/core/platform/env.o: In function `tensorflow::mutex::mutex()':
env.cc:(.text._ZN10tensorflow5mutexC2Ev[_ZN10tensorflow5mutexC5Ev]+0x14): undefined reference to `nsync::nsync_mu_init(nsync::nsync_mu_s_*)'
/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_obj/tensorflow/core/platform/env.o: In function `tensorflow::mutex::lock()':
env.cc:(.text._ZN10tensorflow5mutex4lockEv[_ZN10tensorflow5mutex4lockEv]+0x14): undefined reference to `nsync::nsync_mu_lock(nsync::nsync_mu_s_*)'
/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_obj/tensorflow/core/platform/env.o: In function `tensorflow::mutex::unlock()':
env.cc:(.text._ZN10tensorflow5mutex6unlockEv[_ZN10tensorflow5mutex6unlockEv]+0x14): undefined reference to `nsync::nsync_mu_unlock(nsync::nsync_mu_s_*)'
collect2: error: ld returned 1 exit status
tensorflow/contrib/makefile/Makefile:631: recipe for target '/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_bin/proto_text' failed
make: *** [/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/gen/host_bin/proto_text] Error 1
请注意,提供了nsync库,并且没有出现错误,说它无法找到(上面引用:/work/opt/cortex-a7-myplatform/tensorflow/tensorflow/tensorflow/contrib/makefile/downloads/nsync/builds/x86_64.linux.gcc/nsync.a
)
检查那里的图书馆似乎有符号。所有三种缺失的方法都有“T”和“T”。 “U”条目......
$nm nsync.a | grep nsync_mu
U nsync_mu_semaphore_init
U nsync_mu_lock
U nsync_mu_semaphore_v
U nsync_mu_unlock
U nsync_mu_lock
U nsync_mu_lock_slow_
U nsync_mu_rlock
U nsync_mu_runlock
U nsync_mu_semaphore_v
U nsync_mu_unlock
0000000000000611 T nsync_mu_debug_state
0000000000000683 T nsync_mu_debug_state_and_waiters
00000000000006f5 T nsync_mu_debugger
00000000000009aa T nsync_mu_assert_held
0000000000000021 T nsync_mu_init
00000000000009e9 T nsync_mu_is_reader
0000000000000213 T nsync_mu_lock
0000000000000031 T nsync_mu_lock_slow_
00000000000009c8 T nsync_mu_rassert_held
00000000000002e3 T nsync_mu_rlock
0000000000000294 T nsync_mu_rtrylock
000000000000090a T nsync_mu_runlock
U nsync_mu_semaphore_p
U nsync_mu_semaphore_v
00000000000001c1 T nsync_mu_trylock
000000000000087d T nsync_mu_unlock
000000000000046c T nsync_mu_unlock_slow_
U nsync_mu_lock_slow_
U nsync_mu_unlock_slow_
000000000000041a T nsync_mu_unlock_without_wakeup
00000000000003e6 T nsync_mu_wait
0000000000000000 T nsync_mu_wait_with_deadline
U nsync_mu_lock
U nsync_mu_semaphore_v
U nsync_mu_trylock
U nsync_mu_unlock
U nsync_mu_wait
U nsync_mu_lock
U nsync_mu_unlock
U nsync_mu_lock
U nsync_mu_semaphore_p_with_deadline
U nsync_mu_unlock
U nsync_mu_semaphore_p_with_deadline
0000000000000000 T nsync_mu_semaphore_init
0000000000000007 T nsync_mu_semaphore_p
000000000000008e T nsync_mu_semaphore_p_with_deadline
00000000000001c7 T nsync_mu_semaphore_v
我在这里缺少什么?感谢您阅读此内容。
答案 0 :(得分:0)
经典案例不够仔细阅读。
缺少的链接器错误表明他们正在寻找表单的方法
nsync::nsync_mu_init(nsync::nsync_mu_s_*)
。
nm
输出指定C风格的函数。
可以通过编译和链接nsync的C ++版本而不是C版本来解决错误。