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

问题描述 投票:0回答:2

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

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

我注意到并且不明白的是我的项目使用这个库的顺序很好

 -lfreenect -lGL -lglut -lGLU -lOpenCL 

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

-lfreenect -lOpenCL -lGL -lglut -lGLU

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

c++ opengl opencl
2个回答
3
投票

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

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


1
投票

想一想:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.