linux – 对库的未定义参考,那么我怎样才能找到正确的路径?
我想在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. 谢谢. 解决方法
正如Chris指出的那样,顺序是错误的,你需要在源代码/对象文件之后放置-lX11 -lXext.
这是因为现代编译器试图优化最终结果而不是链接未使用的库. 例 你的程序测试使用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,因此它创建了从程序中使用它的代码.在链接器检查libbar之前,do_bar_do仍未解析. 考虑以错误的方式做到这一点: $gcc -o test -lfoo test.o -lbar 链接器将首先检查libfoo并查看它不包含任何未解析的符号.凉.然后它将继续test.o并注意do_bar_do和do_foo. do_bar_do由右侧libbar解析,但do_foo根本没有解析,你得到一个错误:
“但代码是一个教程…” 那为什么不起作用? 较旧的编译器,它们对依赖关系的顺序有点松懈(它们会检查所有二进制文件/库/对象是否可以解析给定的符号);这就是为什么你仍然可以找到那些使库在目标文件之前链接的代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |