链接库C ++链接器的顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链接库C ++链接器的顺序相关的知识,希望对你有一定的参考价值。
我正在调试一个依赖于一组库的项目,包括libfreenect,OpenGL和OpenCL。问题是黑屏是输出。
作为调试选项,我已经完全删除了OpenCL代码和链接库,以确保OpenGL正常工作,幸运的是它确实如此。
我注意到并且不明白的是我的项目使用这个库的顺序很好
-lfreenect -lGL -lglut -lGLU -lOpenCL
另一方面,使用此顺序时会给出黑屏
-lfreenect -lOpenCL -lGL -lglut -lGLU
我的问题是:为什么链接库的顺序会影响程序的输出?
安装在系统上的OpenCL接口库可能会引入与最终由程序加载的libGL.so
不同的libGL.so
。例如,如果您已经安装了Mesa OpenCL实现但使用的是NVidia驱动程序,那么与Mesa的OpenCL链接可能会导致Mesa的libGL与OpenGL在您的系统上工作所需的libGL冲突。当然这只是猜测。
尝试在链接顺序配置中对生成的程序二进制文件使用ldd
,并查看它实际引入的共享对象(在哪些路径中)。
想一想:
您已编译了目标文件。这些文件需要额外的方法,而不是那些,在链接步骤中,您需要提供“覆盖”所需方法的库,这样它就可以创建一个简洁的可执行文件。
对于您提供的每个库,链接器接受它,处理它,如果它找到了所需的方法,则使用它们。然后它重建缺少方法的表,并继续包含下一个库。
如果您将OpenCL包含在第一个库中,但您的proyect不直接调用OpenCL方法,则链接器将丢弃该库。稍后当你包含需要OpenCL的库时,它会抛出一个“未定义的XXXXX方法”,因为该库已经被处理过了。或者,在您的情况下,它可能使用与您真正打算使用的库不同的另一个内部库。
一个好的规则是最后包含“基本”库,以便它们可以在所有其他库中使用。在这种情况下,OpenCL不依赖于任何GL库,因此您应该最后添加它。
以上是关于链接库C ++链接器的顺序的主要内容,如果未能解决你的问题,请参考以下文章