在linux系统下编译Qt动态链接库的一些问题:“ln: 无法创建符号链'lib*.so': 不支持的操作,”cannot find -lGL"

Qt在linux系统下编译动态链接库的问题。

原始Qt工程是在Windows系统中用Qt 5.11编写。包括两部分:主程序(.exe)工程+动态链接库(.dll)工程。
在VM中创建了Ubuntu系统,并安装了Qt5.9.0版本(Qt 5.9.0 Linux 安装包的名称为 qt-opensource-linux-x64-5.9.0.run)
原本的思路是,在虚拟机和主机之间创建一个共享文件夹。把Qt工程放到共享文件夹中,在linux系统中直接用Qt 编译,编译完成后。回到win系统直接将编译结果拷贝走即可。

问题1:“ ln: 无法创建符号链接’lib*.so’: 不支持的操作”

在linux下编译dll工程时,无法生成*.so、.so.1、.so.1.0文件,只生成了*.so.1.0.0。报的错误是“ ln: 无法创建符号链接’lib*.so’: 不支持的操作”。
这个错误原因是:windows只能在NTFS文件系统创建硬链接,而且只有在同一文件系统中的文件才能创建硬链接。编译的dll工程源代码放在了windows和linux虚拟机的共享目录里。共享目录所在的文件系统和linux的文件系统并不是同一个文件系统,故而不能创建硬链接。将dll工程源代码移动到linux系统的文件夹中即可解决。

问题2:“ cannot find -lGL”

在linux下编译主程序工程时,出现“cannot find -lGL” ,“collect2:ld returned 1 exit status”错误。
这个错误原因是:Qt 找不到 OpenGL 的动态链接库(libGL.so)。一般是路径不对造成的。

Qt 默认在 /usr/lib/ 目录下查找动态链接库,但是很多 Linux 发行版将 OpenGL 链接库放在其它目录,例如我使用的ukylin,OpenGL 链接库位于 /usr/lib/x86_64-linux-gnu/ 目录。只要把 libGL.so 拷贝到 /usr/lib/ 目录,或者在 /usr/lib/ 目录下为 libGL.so 创建一个链接,就能解决问题。
另外,Linux 发行版自带的 OpenGL 链接库在后缀中添加了版本号,例如 libGL.so.1、libGL.so.1.7.0、libGL.so.1.3.1 等,但是 Qt 在链接阶段查找的 OpenGL 链接库是不带版本号的。
总起来说,我们需要在 /usr/lib/ 目录下为 OpenGL 链接库创建一个链接,并去掉版本号。
首先使用find /usr -name libGL*命令查找 OpenGL 链接库所在目录,

ukylin@ukylin-virtual-machine:~$ find /usr -name libGL*

然后使用ln -s创建链接(root 用户)。

ukylin@ukylin-virtual-machine:~$ sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/libGL.so

Linux 系统中可能存在多个版本的 libGL.so,为任意一个版本创建链接即可。
完成以上操作,再次启动 Qt,然后编译或者运行,就不会出现“cannot find -lGL”错误了。

猜你喜欢

转载自blog.csdn.net/SmartTiger_CSL/article/details/105311260