尝试从 hidapi 的 linux/hid.c 编译 .so,但对这种性质的任务不是很有经验。共享库具有未定义的符号,但我不知道为什么它们未定义。
从我的程序中使用所说的 .so 会得到简单的错误:
符号查找错误:libhid.so:未定义符号:udev_new
使用 hidapi 的 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
...然后构建为.so:
gcc
pkg-config libudev --libs
-shared -o libhid.so hid.o
...我的 pkg-config 输出是:
$ pkg-config libudev --libs
-ludev -lrt
确认未定义的符号:
nm libhid.so | grep udev
000000000000181f t 复制_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
并且 udev 部门不会出现在 .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)
谢谢