【问题标题】:Undefined symbols in .so after compiling despite supplying libs尽管提供了库,但编译后 .so 中的未定义符号
【发布时间】:2013-11-12 16:41:58
【问题描述】:

尝试从 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 -shared pkg-config libudev --libs -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)

谢谢

【问题讨论】:

    标签: c linux gcc shared-libraries


    【解决方案1】:

    知道了:使用 gcc,库列表必须紧跟在被链接对象之后。由此重新排序:

    gcc -shared `pkg-config libudev --libs` -o libhid.so hid.o
    

    到:

    gcc -shared -o libhid.so hid.o `pkg-config libudev --libs`
    

    ...现在可以生成正常运行的库。这是从以下答案得出的,该答案针对一个不相关的问题,但仍适用于该问题:

    https://stackoverflow.com/a/10456630/515655

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多