gccにおいて -l
オプションを指定する位置は意味を持つ(誤った位置で指定するとリンクエラーになる)ので注意すること!
-l を参照元 listdevs.c (listdevs.o) の前に記述する
1 2 3 4 5 6 7 8 9 10 11 12 |
$ gcc -o listdevs -I/usr/include/libusb-1.0 -lusb-1.0 listdevs.c /tmp/ccy2LPhL.o: In function `print_devs': listdevs.c:(.text+0x36): undefined reference to `libusb_get_device_descriptor' listdevs.c:(.text+0x69): undefined reference to `libusb_get_device_address' listdevs.c:(.text+0x7a): undefined reference to `libusb_get_bus_number' listdevs.c:(.text+0xb3): undefined reference to `libusb_get_port_numbers' /tmp/ccy2LPhL.o: In function `main': listdevs.c:(.text+0x178): undefined reference to `libusb_init' listdevs.c:(.text+0x197): undefined reference to `libusb_get_device_list' listdevs.c:(.text+0x1c5): undefined reference to `libusb_free_device_list' listdevs.c:(.text+0x1d2): undefined reference to `libusb_exit' collect2: error: ld returned 1 exit status |
usb-1.0 (libusb-1.0.so) の関数が参照できない(検索対象外となる)ため、listdevs.o から見たときにリンクエラー(undefined reference)に陥る。
-l
で指定したライブラリは先に指定した listdevs.c (listdevs.o) からは参照できない。
-l を参照元 listdevs.c (listdevs.o) の後に記述する
1 |
$ gcc -o listdevs -I/usr/include/libusb-1.0 listdevs.c -lusb-1.0 |
リンクは成功する。lisdevs.oをロードした後に -l で指定したライブラリの中身を参照(検索)するため、このケースでは期待通りにリンクが成功する。