在 Linux 中将路径添加到 Qt Creator 中的库时出错
Error when path is added to libraries in Qt Creator in Linux
如果我在 Linux 中的 Qt Creator 4.6.0 中创建一个新的 Qt Widget 应用程序并将以下行添加到 pro 文件中:
LIBS += -L/opt/MATLAB/R2018a/sys/os/glnxa64
它编译没有任何问题,但它没有 运行。它显示此分段错误:
这是 /opt/MATLAB/R2018a/sys/os/glnxa64
中的文件列表:
libgcc_s.so.1
libgfortran.so.3
libgfortran.so.3.0.0
libifcore.so.5
libifport.so.5
libimf.so
libintlc.so.5
libiomp5.so
libirc.so
libquadmath.so.0
libquadmath.so.0.0.0
libstdc++.so.6
libstdc++.so.6.0.22
libsvml.so
README.libstdc++
为什么会发生这种情况,如何解决?
应用程序崩溃的原因是Qt和matlab使用不同版本libstdc++6
。当不链接到 matlab 时,标准库位置中的库的标准版本正在由链接器加载。
但是,添加 LIBS += -L/opt/MATLAB/R2018a/sys/os/glnxa64
时,该路径会被 QtCreator 添加到 LD_LIBRARY_PATH
环境变量中。现在链接器首先检查该目录并找到 libstdc++6
并加载它。由于两个版本之间的二进制不兼容,应用程序在 Qt 代码中的某处崩溃。
为了防止这个 "wrong" 库被加载,LD_PRELOAD
可以设置为系统 libstdc++6
版本的环境变量,甚至在加载实际应用程序之前加载这个库.
但是,这只是一种解决方法,很可能会导致 matlab 代码崩溃,因为现在使用的 libstdc++6
beeing 与 matlab 的需求不兼容。
唯一真正的解决方案是针对系统 libstdc++6
从源代码编译 matlab 或从您的发行版存储库安装它。
注意:您应该阅读 README.libstdc++
- 我猜自述文件可以告诉您类似的故事
如果我在 Linux 中的 Qt Creator 4.6.0 中创建一个新的 Qt Widget 应用程序并将以下行添加到 pro 文件中:
LIBS += -L/opt/MATLAB/R2018a/sys/os/glnxa64
它编译没有任何问题,但它没有 运行。它显示此分段错误:
这是 /opt/MATLAB/R2018a/sys/os/glnxa64
中的文件列表:
libgcc_s.so.1
libgfortran.so.3
libgfortran.so.3.0.0
libifcore.so.5
libifport.so.5
libimf.so
libintlc.so.5
libiomp5.so
libirc.so
libquadmath.so.0
libquadmath.so.0.0.0
libstdc++.so.6
libstdc++.so.6.0.22
libsvml.so
README.libstdc++
为什么会发生这种情况,如何解决?
应用程序崩溃的原因是Qt和matlab使用不同版本libstdc++6
。当不链接到 matlab 时,标准库位置中的库的标准版本正在由链接器加载。
但是,添加 LIBS += -L/opt/MATLAB/R2018a/sys/os/glnxa64
时,该路径会被 QtCreator 添加到 LD_LIBRARY_PATH
环境变量中。现在链接器首先检查该目录并找到 libstdc++6
并加载它。由于两个版本之间的二进制不兼容,应用程序在 Qt 代码中的某处崩溃。
为了防止这个 "wrong" 库被加载,LD_PRELOAD
可以设置为系统 libstdc++6
版本的环境变量,甚至在加载实际应用程序之前加载这个库.
但是,这只是一种解决方法,很可能会导致 matlab 代码崩溃,因为现在使用的 libstdc++6
beeing 与 matlab 的需求不兼容。
唯一真正的解决方案是针对系统 libstdc++6
从源代码编译 matlab 或从您的发行版存储库安装它。
注意:您应该阅读 README.libstdc++
- 我猜自述文件可以告诉您类似的故事