4

我正在尝试在 Ubuntu 中编译 v4l2 示例,但出现以下错误:

guilherme@notedev01:~/Downloads/V4l2_samples-0.4.1$ make
gcc -O2  -L/usr/include -lX11 -lXext -o viewer viewer.c
/tmp/ccUjnjWQ.o: In function `image_destroy':
viewer.c:(.text+0x234): undefined reference to `XDestroyImage'
viewer.c:(.text+0x256): undefined reference to `XFreeGC'
viewer.c:(.text+0x277): undefined reference to `XShmDetach'
viewer.c:(.text+0x2ac): undefined reference to `XFreePixmap'
/tmp/ccUjnjWQ.o: In function `image_create':
viewer.c:(.text+0x305): undefined reference to `XCreateGC'
viewer.c:(.text+0x31d): undefined reference to `XGetWindowAttributes'
viewer.c:(.text+0x39e): undefined reference to `XShmCreateImage'
viewer.c:(.text+0x3f5): undefined reference to `XShmAttach'
viewer.c:(.text+0x44e): undefined reference to `XCreateImage'
viewer.c:(.text+0x494): undefined reference to `XShmQueryExtension'
viewer.c:(.text+0x4b4): undefined reference to `XShmPixmapFormat'
viewer.c:(.text+0x4dc): undefined reference to `XShmCreatePixmap'
/tmp/ccUjnjWQ.o: In function `image_put':
viewer.c:(.text+0x54c): undefined reference to `XPutImage'
viewer.c:(.text+0x586): undefined reference to `XShmPutImage'
/tmp/ccUjnjWQ.o: In function `main':
viewer.c:(.text.startup+0x18b): undefined reference to `XOpenDisplay'
viewer.c:(.text.startup+0x1b1): undefined reference to `XScreenOfDisplay'
viewer.c:(.text.startup+0x1ee): undefined reference to `XCreateSimpleWindow'
viewer.c:(.text.startup+0x249): undefined reference to `XMapRaised'
viewer.c:(.text.startup+0x263): undefined reference to `XStoreName'
viewer.c:(.text.startup+0x280): undefined reference to `XGetWindowAttributes'
viewer.c:(.text.startup+0x92f): undefined reference to `XPending'
viewer.c:(.text.startup+0x94c): undefined reference to `XNextEvent'
viewer.c:(.text.startup+0xaee): undefined reference to `XPending'
viewer.c:(.text.startup+0xb0b): undefined reference to `XNextEvent'
viewer.c:(.text.startup+0xf39): undefined reference to `XPending'
viewer.c:(.text.startup+0xf56): undefined reference to `XNextEvent'
collect2: error: ld returned 1 exit status
make: *** [viewer] Error 1

我可以看到-lx11 和-lXext 的路径不是-L/usr/include。我怎样才能找到这些库的正确路径?

谢谢。

4

2 回答 2

6

正如克里斯指出的那样,顺序是错误的,你需要把-lX11 -lXext源代码/目标文件之后。

这是因为现代编译器试图优化最终结果,而不是链接到未使用的库。他们通过在对象中维护一个未解析符号列表并使用链接器参数中出现的任何二进制文件来解析这些符号来做到这一点。

例子

您的程序测试使用do_foo()来自libfoodo_bar_do()的函数和来自libbar的函数。

你链接它使用:

$ gcc -o test test.o -lfoo -lbar

链接器首先搜索test.o并注意到某些符号 (do_foodo_bar_do) 没有在任何地方定义。然后它继续libfoo(在 之后指定test.o)并发现它提供了do_foo,因此它创建代码以从您的程序中使用它。do_bar_do仍然没有解决,直到链接器检查libbar.

考虑以错误的方式进行操作:

$ gcc -o test -lfoo test.o -lbar

链接器将首先检查libfoo并查看它不包含任何未解析的符号。凉爽的。然后它将继续test.o并注意到do_bar_doand do_foodo_bar_do由右手解决libbardo_foo根本没有解决,你会得到一个错误:

未定义对“do_foo”的引用

“但代码是一个教程......”

那么为什么它不起作用呢?

较旧的编译器对依赖顺序有点松懈(他们会检查所有二进制文件/库/对象是否可以解析给定符号);这就是为什么您仍然可以在那里找到将库链接到目标文件之前的代码。

于 2013-08-22T16:13:52.963 回答
2

-lX11 -lXext必须命令行中的后面viewer.c(并且可能应该在 order 中-lXext -lX11)。另外,确保安装了libx11-6-devlibxext6-dev软件包。

系统库通常位于/liband/usr/lib中,您不需要使用-L来指定这些目录。

于 2013-08-20T02:51:38.530 回答