我正在尝试在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。 如何为这些库找到正确的路径?
感谢。
答案 0 :(得分:5)
正如克里斯指出的那样,顺序是错误的,你需要把-lX11 -lXext
放在源代码/对象文件之后。
这是因为现代编译器尝试优化最终结果而不是链接未使用的库。 他们这样做是通过在对象中维护一个未解析的符号列表,并使用链接器参数中 aferwards 的任何二进制文件来解析这些符号。
您的程序 test 使用 libfoo 中的函数do_foo()
和 libbar 中的函数do_bar_do()
。
使用以下方式链接:
$ gcc -o test test.o -lfoo -lbar
链接器首先搜索test.o
,并注意到某些符号(do_foo
和do_bar_do
)未在任何地方定义。然后转到libfoo
(在test.o
之后指定)并发现它提供do_foo
,因此它会创建代码以便从您的程序中使用它。 do_bar_do
仍未解决,直到链接器检查libbar
。
考虑采用错误的方式:
$ gcc -o test -lfoo test.o -lbar
链接器将首先检查libfoo
并查看它不包含任何未解析的符号。凉。然后,它会继续test.o
并注意do_bar_do
和do_foo
。 do_bar_do
由右侧libbar
解决,但do_foo
根本没有得到解决,而且您收到错误:
未定义对`do_foo'的引用
那为什么不起作用?
较旧的编译器,它们对依赖关系的顺序有点松懈(它们会检查所有二进制文件/库/对象是否可以解析给定的符号);这就是为什么你仍然可以找到那些在目标文件之前将库链接到的代码。
答案 1 :(得分:2)
-lX11 -lXext
必须在命令行中的viewer.c
之后(并且应该按照-lXext -lX11
的顺序)。另外,请确保已安装libx11-6-dev
和libxext6-dev
软件包。
系统库通常位于/lib
和/usr/lib
中,您无需使用-L
来指定这些目录。