运行示例 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,找到链接器标志,将它们复制到我的编译命令中,并继续删除标志,直到我找到仍然可以编译的最小集合。
这是低效的,无聊的,让我觉得必须有更好的方法。
问题是如何通过检查源文件来确定要使用的链接器标志。下面的示例适用于 Debian。头文件是这里要注意的相关项目。
所以,假设有一个包含头文件的 C 源文件
#include <X11/extensions/XInput.h>.
Run Code Online (Sandbox Code Playgroud)
我们可以搜索XInput.h
using ,比如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
链接器标志。
类似的方法应该适用于任何带有包管理系统的发行版。
归档时间: |
|
查看次数: |
6291 次 |
最近记录: |