简体   繁体   English

使用 go build CGO_ENABLED 交叉编译 - 警告:未找到 libudev.so.1

[英]Cross-compile using go build CGO_ENABLED - warning: libudev.so.1 not found

I am trying to cross-compile a Golang application for a Raspberry Pi with CGO_ENABLED=1 due to a libusb dependency由于libusb依赖性,我正在尝试为CGO_ENABLED=1的 Raspberry Pi 交叉编译 Golang 应用程序

During compilation I get the error:在编译期间,我收到错误:

arm-linux-gnueabihf/bin/ld: warning: libudev.so.1, needed by /usr/lib/arm-linux-gnueabihf/libusb-1.0.so, not found (try using -rpath or -rpath-link)

I have tried multiple variations of the command below with no luck:我尝试了以下命令的多种变体,但没有成功:

CGO_ENABLED=1 GOARCH=arm GOARM=7 PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ go build -x -ldflags '-extld=arm-linux-gnueabihf-gcc -rpath=/usr/lib/arm-linux-gnueabihf -L/usr/lib/arm-linux-gnueabihf -ludev'

When I run the build with the -x flag I get the verbose output, and it kinda looks like its failing whilst building the src/net package:当我使用-x标志运行构建时,我得到了详细的输出,看起来它在构建src/net包时失败了:

cd /usr/local/go/src/net
/usr/local/go/pkg/tool/linux_amd64/cgo -dynpackage net -dynimport $WORK/net/_obj/_cgo_.o -dynout $WORK/net/_obj/_cgo_import.go
arm-linux-gnueabihf-gcc -I . -fPIC -marm -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK=/tmp/go-build -gno-record-gcc-switches -o $WORK/net/_obj/_all.o $WORK/net/_obj/_cgo_export.o $WORK/net/_obj/cgo_linux.cgo2.o $WORK/net/_obj/cgo_resnew.cgo2.o $WORK/net/_obj/cgo_socknew.cgo2.o $WORK/net/_obj/cgo_unix.cgo2.o -g -O2 -Wl,-r -nostdlib -Wl,--build-id=none
/usr/local/go/pkg/tool/linux_amd64/compile -o $WORK/net.a -trimpath $WORK -p net -buildid 9e58c94d1ddeba63666a35ecee9409056baf5d3c -D _/usr/local/go/src/net -I $WORK -pack ./addrselect.go ./conf.go ./dial.go ./dnsclient.go ./dnsclient_unix.go ./dnsconfig_unix.go ./dnsmsg.go ./fd_mutex.go ./fd_poll_runtime.go ./fd_posix.go ./fd_unix.go ./file.go ./file_unix.go ./hook.go ./hook_cloexec.go ./hook_unix.go ./hosts.go ./interface.go ./interface_linux.go ./ip.go ./iprawsock.go ./iprawsock_posix.go ./ipsock.go ./ipsock_posix.go ./lookup.go ./lookup_unix.go ./mac.go ./net.go ./nss.go ./parse.go ./pipe.go ./port.go ./port_unix.go ./sendfile_linux.go ./sock_cloexec.go ./sock_linux.go ./sock_posix.go ./sockopt_linux.go ./sockopt_posix.go ./sockoptip_linux.go ./sockoptip_posix.go ./tcpsock.go ./tcpsock_posix.go ./tcpsockopt_posix.go ./tcpsockopt_unix.go ./udpsock.go ./udpsock_posix.go ./unixsock.go ./unixsock_posix.go ./writev_unix.go $WORK/net/_obj/_cgo_gotypes.go $WORK/net/_obj/cgo_linux.cgo1.go $WORK/net/_obj/cgo_resnew.cgo1.go $WORK/net/_obj/cgo_socknew.cgo1.go $WORK/net/_obj/cgo_unix.cgo1.go $WORK/net/_obj/_cgo_import.go
# github.com/resin-io/edge-node-manager/vendor/github.com/kylelemons/gousb/usb
/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: warning: libudev.so.1, needed by /usr/lib/arm-linux-gnueabihf/libusb-1.0.so, not found (try using -rpath or -rpath-link)
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_filter_add_match_subsystem_devtype@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_enable_receiving@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_enumerate_scan_devices@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_new@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_device_get_devnode@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_enumerate_new@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_list_entry_get_name@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_enumerate_add_match_subsystem@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_device_get_sysname@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_enumerate_get_list_entry@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_device_new_from_syspath@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_new_from_netlink@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_receive_device@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_device_unref@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_enumerate_unref@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_get_fd@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_list_entry_get_next@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_monitor_unref@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `clock_gettime@GLIBC_2.17'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_unref@LIBUDEV_183'
/usr/lib/arm-linux-gnueabihf/libusb-1.0.so: undefined reference to `udev_device_get_action@LIBUDEV_183'
collect2: error: ld returned 1 exit status

The strange thing is that the compiler can find /usr/lib/arm-linux-gnueabihf/libusb-1.0.so and if I do ls -al in that directory libudev.so is also present.奇怪的是,编译器可以找到/usr/lib/arm-linux-gnueabihf/libusb-1.0.so并且如果我在该目录中执行ls -allibudev.so也存在。 Both files linking back to /lib/arm-linux-gnueabihf/两个文件都链接回/lib/arm-linux-gnueabihf/

lrwxrwxrwx 1 root root     41 Jan  7 04:14 libudev.so -> /lib/arm-linux-gnueabihf/libudev.so.1.5.0
-rw-r--r-- 1 root root 105464 Jun 16  2014 libusb-1.0.a
lrwxrwxrwx 1 root root     44 Jun 16  2014 libusb-1.0.so -> /lib/arm-linux-gnueabihf/libusb-1.0.so.0.1.0
drwxr-xr-x 2 root root   4096 Mar 15 14:48 pkgconfig

/usr/lib/arm-linux-gnueabihf/pkgconfig contains: /usr/lib/arm-linux-gnueabihf/pkgconfig包含:

-rw-r--r-- 1 root root  513 Jan  7 04:13 libudev.pc
-rw-r--r-- 1 root root  332 Jun 16  2014 libusb-1.0.pc

Finally, running file shows both libusb and libudev to be the correct architecture:最后,运行file显示libusblibudev都是正确的架构:

/lib/arm-linux-gnueabihf/libusb-1.0.so.0.1.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=7d7b487c91042c1f254b39516b4aeabedfb828fc, stripped
/lib/arm-linux-gnueabihf/libudev.so.1.5.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=334f4f0d8b1222a324ccd0827c1613fdd1e2ec15, stripped

The path of libudev.so.1 is error. libudev.so.1路径错误。

It should be in one of these directories:它应该在以下目录之一中:

./arm-linux-gnueabihf/lib
./arm-linux-gnueabihf/libc/lib
./arm-linux-gnueabihf/libc/usr/lib

But I am sorry that I forget which directory is right.但是很抱歉我忘记了哪个目录是正确的。 So you can try to copy libudev.so.1 to all of these directories.因此,您可以尝试将libudev.so.1复制到所有这些目录中。

I know that this is an old post but I've faced a similar issue on Rust thus I decided to post my workaround as a memo.我知道这是一篇旧帖子,但我在 Rust 上遇到了类似的问题,因此我决定将我的解决方法作为备忘录发布。

tl;dr tl;博士

Use -rpath-link to tell ld a correct path.使用-rpath-link告诉ld一个正确的路径。 With Rust, use RUSTFLAGS like:对于 Rust,请使用RUSTFLAGS例如:

RUSTFLAGS="-C link-arg=-Wl,-rpath-link,/lib/arm-linux-gnueabihf"

speculation投机

It seems that the /usr/lib/arm-linux-gnueabihf is specified through libdir in libusb-1.0.pc like:似乎/usr/lib/arm-linux-gnueabihf是通过libusb-1.0.pc libdir指定的,例如:

prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/arm-linux-gnueabihf
includedir=${prefix}/include

Name: libusb-1.0
Description: C API for USB device access from Linux, Mac OS X, Windows, OpenBSD/NetBSD and Solaris userspace
Version: 1.0.21
Libs: -L${libdir} -lusb-1.0
Libs.private: -ludev  -pthread
Cflags: -I${includedir}/libusb-1.0

but /lib/arm-linux-gnueabihf is specified through libdir in libudev.pc like:但是/lib/arm-linux-gnueabihf是通过libudev.pc libdir指定的,例如:

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

prefix=/usr
exec_prefix=/usr
libdir=/lib/arm-linux-gnueabihf
includedir=/usr/include

Name: libudev
Description: Library to access udev device information
Version: 237
Libs: -L${libdir} -ludev
Cflags: -I${includedir}

So I've tried所以我试过了

  • Create a symlink from /lib/arm-linux-gnueabihf/libudev.so.1 to /usr/lib/arm-linux-gnueabihf/libudev.so.1创建从/lib/arm-linux-gnueabihf/libudev.so.1/usr/lib/arm-linux-gnueabihf/libudev.so.1的符号链接
  • Add /lib/arm-linux-gnueabihf to LD_LIBRARY_PATH/lib/arm-linux-gnueabihfLD_LIBRARY_PATH

But only -rpath-link worked.但只有-rpath-link有效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM