Attempting to compile .so from hidapi's linux/hid.c but not very experienced with tasks of this nature. Shared lib has undefined symbols but I don't know why they are being left undefined.
Using said .so from my program gets straightforward error:
symbol lookup error: libhid.so: undefined symbol: udev_new
Using a modified version of hidapi's linux makefile:
all: hidtest
CC ?= gcc
CFLAGS ?= -Wall -fPIC -c -g
CXX ?= g++
CXXFLAGS ?= -Wall -fPIC -g
COBJS = hid.o
CPPOBJS = ../hidtest/hidtest.o
OBJS = $(COBJS) $(CPPOBJS)
LIBS = `pkg-config libudev --libs`
INCLUDES ?= -I../hidapi `pkg-config libudev --cflags`
hidtest: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ $(LIBS) -o hidtest
$(COBJS): %.o: %.c
$(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@
$(CPPOBJS): %.o: %.cpp
$(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@
clean:
rm -f $(OBJS) hidtest
.PHONY: clean
...which is then built to .so:
gcc -shared
pkg-config libudev --libs-o libhid.so hid.o
... my pkg-config output is:
$ pkg-config libudev --libs
-ludev -lrt
Confirming the undefined symbols:
nm libhid.so | grep udev
000000000000181f t copy_udev_string
U udev_device_get_devnode U udev_device_get_parent_with_subsystem_devtype U udev_device_get_sysattr_value U udev_device_new_from_devnum U udev_device_new_from_syspath U udev_device_unref U udev_enumerate_add_match_subsystem U udev_enumerate_get_list_entry U udev_enumerate_new U udev_enumerate_scan_devices U udev_enumerate_unref U udev_list_entry_get_name U udev_list_entry_get_next U udev_new U udev_unref
And udev deps don't show up in the .so:
$ldd libhid.so
linux-vdso.so.1 => (0x00007ffffcffe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc9d03a3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc9d099e000)
Thank you
Got it: With gcc the library list must be immediately following the object being linked. From this the reordering of:
gcc -shared `pkg-config libudev --libs` -o libhid.so hid.o
to:
gcc -shared -o libhid.so hid.o `pkg-config libudev --libs`
...now results in properly functioning lib. This was derived from the following answer which was to an unrelated question but still applied to this question:
https://stackoverflow.com/a/10456630/515655
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With