google / XNNPACK

High-efficiency floating-point neural network inference operators for mobile, server, and Web

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Build (linker) error - Undefined references to 'exp' and 'lrintf' - Cross-compiling from x64 Ubuntu 21.10 (WSL) to Arm64 Linux

misterBart opened this issue · comments

Attempting to build Xnnpack's master branch for Arm64 Linux, but it gives the following linker error:

/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(softmax-nc.c.o): in function `xnn_create_softmax_nc_qu8':
softmax-nc.c:(.text+0x15c): undefined reference to `exp'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: softmax-nc.c:(.text+0x164): undefined reference to `lrint'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(indirection.c.o): in function `xnn_indirection_init_resize_bilinear2d_hwc_q11':
indirection.c:(.text+0x162c): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1638): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1820): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x182c): undefined reference to `lrintf'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/operator-size-test.dir/build.make:107: operator-size-test] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:4816: CMakeFiles/operator-size-test.dir/all] Error 2
gmake[1]: *** Waiting for unfinished jobs....

Attached the complete build log to this post (also contains a build warning).
arm64BuildLog.txt

#2469 should help, but overall I couldn't reproduce this failure.

Too bad, it did not work. I did a fresh clone and build, but it gave me the same undefined references to exp and lrint.

I also edited scripts/build-local.sh to include:
CMAKE_ARGS+=("-DCMAKE_SYSTEM_NAME=Linux")
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc")
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++")
CMAKE_ARGS+=("-DCMAKE_SYSTEM_PROCESSOR=aarch64")
Executing scripts/build-local.sh again gave the undefined references to exp and lrint, but now the output was slightly more detailed:

[3695/3998] Linking C executable operator-size-test
FAILED: operator-size-test
: && /usr/bin/aarch64-linux-gnu-gcc -O3 -DNDEBUG  CMakeFiles/operator-size-test.dir/test/operator-size.c.o -o operator-size-test  libXNNPACK.a  cpuinfo/libcpuinfo.a  clog/libclog.a  pthreadpool/libpthreadpool.a && :
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(softmax-nc.c.o): in function `xnn_create_softmax_nc_qu8':
softmax-nc.c:(.text+0x15c): undefined reference to `exp'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: softmax-nc.c:(.text+0x164): undefined reference to `lrint'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(indirection.c.o): in function `xnn_indirection_init_resize_bilinear2d_hwc_q11':
indirection.c:(.text+0x1384): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1390): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1504): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1510): undefined reference to `lrintf'
collect2: error: ld returned 1 exit status
[3696/3998] Linking C executable subgraph-size-test
FAILED: subgraph-size-test
: && /usr/bin/aarch64-linux-gnu-gcc -O3 -DNDEBUG  CMakeFiles/subgraph-size-test.dir/test/subgraph-size.c.o -o subgraph-size-test  libXNNPACK.a  cpuinfo/libcpuinfo.a  clog/libclog.a  pthreadpool/libpthreadpool.a && :
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(add2.c.o): in function `create_add_operator':
add2.c:(.text+0x1e4): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: add2.c:(.text+0x200): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: add2.c:(.text+0x270): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: add2.c:(.text+0x28c): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(clamp.c.o): in function `create_clamp_operator':
clamp.c:(.text+0x144): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(clamp.c.o):clamp.c:(.text+0x160): more undefined references to `lrintf' follow
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(lut-elementwise-nc.c.o): in function `calculate_elu':
lut-elementwise-nc.c:(.text+0x2c): undefined reference to `expm1f'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(lut-elementwise-nc.c.o): in function `calculate_tanh':
lut-elementwise-nc.c:(.text+0x4c): undefined reference to `tanhf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(lut-elementwise-nc.c.o): in function `calculate_sigmoid':
lut-elementwise-nc.c:(.text+0x6c): undefined reference to `expf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: lut-elementwise-nc.c:(.text+0x84): undefined reference to `expf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(lut-elementwise-nc.c.o): in function `create_lut_elementwise_nc':
lut-elementwise-nc.c:(.text+0x2a4): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(softmax-nc.c.o): in function `xnn_create_softmax_nc_qu8':
softmax-nc.c:(.text+0x15c): undefined reference to `exp'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: softmax-nc.c:(.text+0x164): undefined reference to `lrint'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: libXNNPACK.a(indirection.c.o): in function `xnn_indirection_init_resize_bilinear2d_hwc_q11':
indirection.c:(.text+0x1384): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1390): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1504): undefined reference to `lrintf'
/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: indirection.c:(.text+0x1510): undefined reference to `lrintf'
collect2: error: ld returned 1 exit status
[3698/3998] Linking CXX executable f32-im2col-gemm-bench
ninja: build stopped: subcommand failed.

I noticed the link command is: /usr/bin/aarch64-linux-gnu-gcc -O3 -DNDEBUG CMakeFiles/operator-size-test.dir/test/operator-size.c.o -o operator-size-test libXNNPACK.a cpuinfo/libcpuinfo.a clog/libclog.a pthreadpool/libpthreadpool.a
Shouldn't math library -lm be appended in the link command?

You can't cross-compile by just specifying extra CMake options. You need to get a proper CMake toolchain file and specify it via -DCMAKE_TOOLCHAIN_FILE=....

A build-linux-arm64.sh, in addition to the existing build scripts, would be greatly appreciated by those with little experience with CMake

For those also wanting to build for Arm64-Linux, I got it working with the following CMake toolchain file:

set(CMAKE_SYSTEM_NAME Linux)  #OS on target machine
set(CMAKE_SYSTEM_PROCESSOR aarch64)  #Target processor

set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)

set(CMAKE_ASM_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(CMAKE_LINKER /usr/aarch64-linux-gnu/bin/ld)

set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)  #Search under specified folders (before searching under specified folders in CMAKE_SYSROOT)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)      #find_program() should never search in CMAKE_FIND_ROOT_PATH
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)       #find_library() should only search in CMAKE_FIND_ROOT_PATH
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)       #find_file() and find_path() should only search in CMAKE_FIND_ROOT_PATH
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)       #find_package() should only search in CMAKE_FIND_ROOT_PATH

Feel free to improve, I am no CMake expert.