在QMake中设置RPATH顺序

 老娘叫凌凌_523 发布于 2022-12-07 10:20

我有一个Linux Qt程序.我希望它优先使用可执行文件目录中的(动态)Qt库(如果存在),否则使用系统的Qt库.RPATH来救援.

我将此行添加到qmake的.pro文件中:

QMAKE_LFLAGS    += '-Wl,-rpath,\'\$$ORIGIN\''

readelf查看生成的可执行文件,我看到:

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]

似乎没错,但ldd显示它使用的是系统版本:

libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)

如果我手动编辑qmake生成的Makefile来交换两个rpath的顺序,那么$ ORIGIN出现在/ usr/local/...之后,我得到了正确的行为:

0x000000000000000f (RPATH)              Library rpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
0x000000000000001d (RUNPATH)            Library runpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]

libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)

我的问题是qmake如何构造最终的LFLAGS变量.我无法弄清楚如何使它在系统库之后添加($ ORIGIN).有任何想法吗?

1 个回答
  • 您可以将以下内容添加到.pro文件中,以强制动态链接器在运行时在Linux中查找与Qt应用程序相同的目录:

    unix:{
        # suppress the default RPATH if you wish
        QMAKE_LFLAGS_RPATH=
        # add your own with quoting gyrations to make sure $ORIGIN gets to the command line unexpanded
        QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'"
    }
    

    如果您希望它查看可执行路径的子目录,您可以使用:

    QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/libs\'"
    

    请注意,您的应用程序目录中应该具有完全相同名称的.so文件.例如,您应该libQt5Core.so.5.2.0使用名称复制到您的应用程序目录libQt5Core.so.5.现在ldd显示了应用程序的目录.

    您还可以libQt5Core.so.5.2.0使用libQt5Core.so.5应用程序目录中的名称和链接.

    2022-12-11 02:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有