链接库C ++链接器的顺序

时间:2015-06-16 23:39:35

标签: c++ opengl opencl

我正在调试一个依赖于一组库的项目,包括libfreenect,OpenGL和OpenCL。问题是黑屏是输出。

作为一个调试选项,我已经完全删除了OpenCL代码和链接库,以确保OpenGL正常工作,幸运的是它。

我注意到并且不明白的是,我的项目使用此库顺序

运行良好
 -lfreenect -lGL -lglut -lGLU -lOpenCL 

另一方面,使用此顺序时会出现黑屏

-lfreenect -lOpenCL -lGL -lglut -lGLU

我的问题是:为什么链接库的顺序会影响程序的输出?

2 个答案:

答案 0 :(得分:3)

系统上安装的OpenCL接口库可能会引入与程序最终加载的libGL.so不同的libGL.so。例如,如果您已经安装了Mesa OpenCL实现但使用的是NVidia驱动程序,那么与Mesa的OpenCL链接可能会导致Mesa的libGL与OpenGL所需的libGL冲突。你的系统;当然这只是猜测。

尝试在链接顺序配置中对生成的程序二进制文件使用ldd,并查看它实际引入的共享对象(在哪些路径中)。

答案 1 :(得分:1)

这样想:

您已编译了目标文件。这些文件需要额外的方法,而不是那些,在链接步骤中,您需要提供"覆盖"那些需要的方法,所以它可以创建一个整洁的可执行文件。

对于您提供的每个库,链接器接受它,处理它,如果它找到了所需的方法,则使用它们。 然后它重建缺少方法的表,并继续包含下一个库。

如果您将OpenCL包含在第一个库中,但您的proyect不直接调用OpenCL方法,则链接器将丢弃该库。 稍后当你包含需要OpenCL的库时,它会抛出一个"未定义的XXXXX方法",因为该库已经被处理过了。 或者,在您的情况下,它可能使用与您真正打算使用的内部库不同的另一个内部库。

一个好的规则是包括"基本"库最后,因此它们可以在所有其他库中使用。在这种情况下,OpenCL不依赖于任何GL库,因此您应该最后添加它。