How to fix linker errors for libudev on Ubuntu 15
Asked Answered
G

2

5

I've installed libudev-dev, I can see the file /usr/lib/x86_64-linux-gnu/libudev.so but when I run gcc -Wall -ludev -o test test.c I get following error..

opensourcegeek@box:~/project/udev_device_discovery$ gcc -Wall -ludev -o test test.c 
/tmp/ccg6Ydod.o: In function `main':
test.c:(.text+0xa): undefined reference to `udev_new'
test.c:(.text+0x35): undefined reference to `udev_enumerate_new'
test.c:(.text+0x4a): undefined reference to `udev_enumerate_add_match_subsystem'
test.c:(.text+0x60): undefined reference to `udev_enumerate_add_match_property'
test.c:(.text+0x76): undefined reference to `udev_enumerate_add_match_property'
test.c:(.text+0x82): undefined reference to `udev_enumerate_scan_devices'
test.c:(.text+0x8e): undefined reference to `udev_enumerate_get_list_entry'
test.c:(.text+0xab): undefined reference to `udev_list_entry_get_name'
test.c:(.text+0xc2): undefined reference to `udev_device_new_from_syspath'
test.c:(.text+0xd2): undefined reference to `udev_device_get_parent'
test.c:(.text+0xe2): undefined reference to `udev_device_get_devnode'
test.c:(.text+0x105): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x119): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x13f): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x153): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x179): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x197): undefined reference to `udev_device_unref'
test.c:(.text+0x1a3): undefined reference to `udev_list_entry_get_next'
test.c:(.text+0x1be): undefined reference to `udev_enumerate_unref'
test.c:(.text+0x1ca): undefined reference to `udev_unref'
test.c:(.text+0x1cf): undefined reference to `udev_new'
test.c:(.text+0x1fa): undefined reference to `udev_enumerate_new'
test.c:(.text+0x20f): undefined reference to `udev_enumerate_add_match_subsystem'
test.c:(.text+0x225): undefined reference to `udev_enumerate_add_match_property'
test.c:(.text+0x23b): undefined reference to `udev_enumerate_add_match_property'
test.c:(.text+0x247): undefined reference to `udev_enumerate_scan_devices'
test.c:(.text+0x253): undefined reference to `udev_enumerate_get_list_entry'
test.c:(.text+0x270): undefined reference to `udev_list_entry_get_name'
test.c:(.text+0x287): undefined reference to `udev_device_new_from_syspath'
test.c:(.text+0x297): undefined reference to `udev_device_get_devnode'
test.c:(.text+0x2ba): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x2ce): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x2f4): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x308): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x32e): undefined reference to `udev_device_get_sysattr_value'
test.c:(.text+0x34c): undefined reference to `udev_device_unref'
test.c:(.text+0x358): undefined reference to `udev_list_entry_get_next'
test.c:(.text+0x373): undefined reference to `udev_enumerate_unref'
test.c:(.text+0x37f): undefined reference to `udev_unref'
collect2: error: ld returned 1 exit status

I don't usually run ubuntu, but same code works on my fedora(slightly older version of libudev) and also a pi which runs wheezy (older version of libudev).

Goby answered 21/12, 2015 at 20:19 Comment(1)
gcc -Wall test.c -ludev try this or gcc --std=c99 test.c -ludevSinfonietta
J
10

The order is important, put the library name at the end of the compilation / linking line:

$ gcc -Wall -o test test.c -ludev
Juliannjulianna answered 21/12, 2015 at 20:26 Comment(3)
Curious, how come fedora or wheezy is tolerant to the wrong order?Goby
@Goby Either you had it in the right order on Fedora or you had it twice: gcc -Wall -ludev -o test test.c -ludev (or you had it as part of a Makefile?). Otherwise, GNU ld would have complained there too.Whatsoever
@l3x Doesn't look like it, I've tried it directly on command line gcc -Wall -ludev -o test test.c it works fine on fedora(gcc 4.8.2-7) and on wheezy(gcc 4.6.3).Goby
W
2

The error you see is a linker error, not because of any installation issues.. Move -ludev to the end of the command line option:

gcc -Wall -o test test.c -ludev
Whatsoever answered 21/12, 2015 at 20:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.