如何找出使用给定 C 库函数所需的链接器标志?

Ank*_*nko 7 compiling c ld

运行示例 C 代码是一项痛苦的练习,除非它带有 makefile。

我经常发现自己有一个 C 文件,其中包含的代码据说可以做一些很酷的事情,但是第一次基本的编译尝试 ( gcc main.c) 失败了——

main.c:(.text+0x1f): undefined reference to `XListInputDevices'
clang-3.7: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

——或类似。

我知道这意味着我缺少正确的链接器标志,例如-lX11,-lXext-lpthread

但哪些呢?


我目前处理这个问题的方法是找到包含一个函数的库头文件,使用 Github 的搜索来查找其他一些导入相同头文件的程序,打开它的 makefile,找到链接器标志,将它们复制到我的编译命令中,并继续删除标志,直到我找到仍然可以编译的最小集合。

这是低效的,无聊的,让我觉得必须有更好的方法。

Fah*_*tha 5

问题是如何通过检查源文件来确定要使用的链接器标志。下面的示例适用于 Debian。头文件是这里要注意的相关项目。

所以,假设有一个包含头文件的 C 源文件

#include <X11/extensions/XInput.h>.
Run Code Online (Sandbox Code Playgroud)

我们可以搜索XInput.husing ,比如apt-file。如果你知道这个头文件包含在一个已安装的包中,dpkg -S或者dlocate也可以使用。例如

apt-file search XInput.h
libxi-dev: /usr/include/X11/extensions/XInput.h
Run Code Online (Sandbox Code Playgroud)

这告诉您该头文件属于 libxi 的开发包(对于 C 库,开发包(通常采用libname-dev或形式libname-devel)包含头文件),因此您应该使用-lxi链接器标志。

类似的方法应该适用于任何带有包管理系统的发行版。