未定义的图书馆参考,所以我怎么find正确的道路?

我想在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的path不是-L / usr / include。 我怎样才能为这些图书馆find正确的道路?

谢谢。

Solutions Collecting From Web of "未定义的图书馆参考,所以我怎么find正确的道路?"

正如Chris所指出的那样,顺序是错误的,您需要在源代码/对象文件之后放置-lX11 -lXext

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

你的程序测试使用do_foo()的函数do_foo()libbar中的函数do_bar_do()

你使用下面的链接:

 $ 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_dodo_foodo_bar_do由右侧的libbar解析,但是do_foo根本没有解析,并且出现错误:

对“do_foo”的未定义引用

“但代码是为了做一个教程…”

那么为什么它不工作?

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

-lX11 -lXext必须位于命令行中的viewer.c 之后 (并且应该按照-lXext -lX11的顺序)。 另外,请确保安装了libx11-6-devlibxext6-dev软件包。

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