尽管为 libusb-1.0 指定了 -l 标志,但 gcc 链接器错误
gcc Linker error despite specifying -l flag for libusb-1.0
我正在为我的库指定一个 -l
标志,所以任何人都可以帮助我理解为什么我收到这个命令的错误吗?
$ gcc `pkg-config --libs --cflags libusb-1.0` sourcefile.c
/tmp/cclBFhzY.o: In function `main':
sourcefile.c:(.text+0x57): undefined reference to `libusb_init'
(pkg-config --libs --cflags libusb-1.0
的计算结果为 -I/usr/include/libusb-1.0 -lusb-1.0
。)
我已经验证 libusb_init
存在于库中:
$ nm /usr/lib/x86_64-linux-gnu/libusb-1.0.a | grep libusb_init
0000000000001a60 T libusb_init
我什至还尝试了带有 -L
选项的 gcc
命令:
gcc -I/usr/include/libusb-1.0 -L/usr/lib/x86_64-linux-gnu -lusb-1.0 sourcefile.c
我仍然收到链接器错误。你看到我做错了什么吗?
(我读过其他几个关于未定义引用错误的帖子,但答案都是显而易见的答案:在 gcc
命令中指定你的库。)
奇怪的是,我无法判断 gcc 是否正在处理我的选项。当我 运行 它带有 -v
标志时,两条突出的线是:
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
...其中不包括我用 -L
指定的目录。 (但看起来路径中的第一个条目相当于我的目录。)并且:
COLLECT_GCC_OPTIONS='-v' '-I' '/usr/include/libusb-1.0' '-L/usr/lib/x86_64-linux-gnu' '-mtune=generic' '-march=x86-64'
...其中不包括我的 -l
选项。 (也许这不是一个有效的问题,因为下一行确实包含 -l
选项。)有什么想法吗?
运行宁Ubuntu16
将 sourcefile.c
移到链接器选项之前。
链接器从左到右移动库和源文件,并在移动时标记未解析的符号。当它到达一个库(例如 -lusb-1.0
)时,链接器会遍历并解析它当时可以找到的任何符号。
您的库未应用于 sourcefile.c
另请参阅:
Why does the order in which libraries are linked sometimes cause errors in GCC?
我正在为我的库指定一个 -l
标志,所以任何人都可以帮助我理解为什么我收到这个命令的错误吗?
$ gcc `pkg-config --libs --cflags libusb-1.0` sourcefile.c
/tmp/cclBFhzY.o: In function `main':
sourcefile.c:(.text+0x57): undefined reference to `libusb_init'
(pkg-config --libs --cflags libusb-1.0
的计算结果为 -I/usr/include/libusb-1.0 -lusb-1.0
。)
我已经验证 libusb_init
存在于库中:
$ nm /usr/lib/x86_64-linux-gnu/libusb-1.0.a | grep libusb_init
0000000000001a60 T libusb_init
我什至还尝试了带有 -L
选项的 gcc
命令:
gcc -I/usr/include/libusb-1.0 -L/usr/lib/x86_64-linux-gnu -lusb-1.0 sourcefile.c
我仍然收到链接器错误。你看到我做错了什么吗?
(我读过其他几个关于未定义引用错误的帖子,但答案都是显而易见的答案:在 gcc
命令中指定你的库。)
奇怪的是,我无法判断 gcc 是否正在处理我的选项。当我 运行 它带有 -v
标志时,两条突出的线是:
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
...其中不包括我用 -L
指定的目录。 (但看起来路径中的第一个条目相当于我的目录。)并且:
COLLECT_GCC_OPTIONS='-v' '-I' '/usr/include/libusb-1.0' '-L/usr/lib/x86_64-linux-gnu' '-mtune=generic' '-march=x86-64'
...其中不包括我的 -l
选项。 (也许这不是一个有效的问题,因为下一行确实包含 -l
选项。)有什么想法吗?
运行宁Ubuntu16
将 sourcefile.c
移到链接器选项之前。
链接器从左到右移动库和源文件,并在移动时标记未解析的符号。当它到达一个库(例如 -lusb-1.0
)时,链接器会遍历并解析它当时可以找到的任何符号。
您的库未应用于 sourcefile.c
另请参阅:
Why does the order in which libraries are linked sometimes cause errors in GCC?