【问题标题】:How can I set where a Qt app finds a Qt module?如何设置 Qt 应用程序在哪里找到 Qt 模块?
【发布时间】:2011-01-30 15:08:07
【问题描述】:

我想将 libQtGui.so.4 libQtNetwork.so.4 和 libQtCore.so.4 包含在与我的应用程序所在的目录相同的目录中。我如何让 Qt 理解这一点? y 目的是拥有一个使用共享库的独立应用程序

【问题讨论】:

  • 你也可以决定静态链接 Qt 库,这样你就不会依赖安装的本地 Qt 版本(这是 Opera 在 linux 下的做法)
  • 在我正在部署的平台上静态链接的问题是 fontconfig 有问题(red Hat 5.3 使用 fontconfig 2.4.1)
  • 当我尝试静态构建时,有一个未定义的对 FcTypeFreeQueryFace 的引用,当我尝试更新 fontconfig 时,它告诉我 fontconfig 是最新的.....bummer..然后我必须找到一种修改 Qt 文件以使用我提供的 fontconfig 版本构建的方法。我可以使用我提供的字体配置动态构建我的应用程序,但不是静态的

标签: qt makefile dynamic-linking


【解决方案1】:

设置 LD_LIBRARY_PATH 环境变量是一种选择。例如:

export LD_LIBRARY_PATH=/path/to/dir/with/libs:$LD_LIBRARY_PATH

另一个选项是在链接期间设置 Qt 应用程序的 RPATH。将 RPATH 设置为值“$ORIGIN”将导致动态链接器在运行时查看与 Qt 应用程序相同的目录。例如,如果使用 qmake,请将以下 sn -p 添加到您的项目文件中:

unix:!mac{
  QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN
  QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/lib
  QMAKE_LFLAGS += -Wl,--rpath=\\\$\$ORIGIN/libs
  QMAKE_RPATH=
}

这会将 RPATH 设置为“$ORIGIN:$ORIGIN/lib:$ORIGIN/libs”,这意味着动态链接器将首先在 Qt 应用程序的位置查找,然后在其位置的 lib 子目录中查找,然后在其所在位置的 libs 子目录中,最后在任何系统定义的位置中。

【讨论】:

  • 这里是编译输出:"g++:unrecognized option '-wl,--rpath=$ORIGIN'" "g++:unrecognized option '-wl,--rpath=$ORIGIN/lib'" "g++:无法识别的选项'-wl,--rpath=$ORIGIN/libs'"
  • 直接在 Makefile 中手动删除了那些,再次按下 build all 然后它通过了......现在试试看。
  • 实际上它现在可以工作了,似乎有一个小错字,我将其更改为 QMAKE_LFLAGS += -Wl,-rpath=\\\$\$ORIGIN 。请注意,它实际上是一个大写的 W(用于 -Wl)和一个用于 -rpath 的破折号。我还添加了 LIBS+= libQtblabla.... 但我要检查它是否在没有 LIBS+= 的情况下工作(LIBS+= 本身肯定不能工作)。非常感谢那件事似乎没有在任何地方记录下来。附言我通过查看 Makefile 注意到了拼写错误,并注意到 -Wl,-rpath 在其他地方使用,所以我得出结论是拼写错误。再次感谢。
  • 这对我不起作用。你有什么建议吗?
【解决方案2】:

UNIX / Linux 将首先查看 LD_LIBRARY_PATH(如果已设置),然后再查看系统标准库。因此,如果您设置它,您确实可以覆盖。就像在 Windows 上设置 PATH 一样。一样的效果。顺序很重要。

您可以添加 ./ 或 .到 LD_LIBRARY_PATH 也是如此。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

【讨论】:

  • 我试过了,但它不起作用。我进入项目并将 LD_LIBRARY_PATH 更改为 .但是当我回到终端并输入 ldd ./MyApp ...我正在从 GUI 构建...我应该从命令行尝试吗?
【解决方案3】:

LD_LIBRARY_PATHQMAKE_RPATH 从来没有为我工作过。相反,我在我的.pro 文件中设置了QMAKE_RPATHDIR。例如,在构建并安装 (make install) Qt 之后,它已被放置在 /usr/local/Trolltech/Qt-4.8.5/lib/ 中。然后我在我的.pro 文件中写下以下内容:

QMAKE_RPATHDIR += /usr/local/Trolltech/Qt-4.8.5/lib/

注意 1:相对路径似乎不起作用。首选绝对路径。

注意2:当你然后make时,你可以看到链接器给出了以下选项:-Wl,-rpath,/usr/local/Trolltech/Qt-4.8.5/lib/

注意 3:为确保二进制文件动态链接到正确的库,您可以在运行时显示 qVersion() 提供的 Qt 版本。

【讨论】:

    猜你喜欢
    • 2014-12-01
    • 2012-10-26
    • 2016-04-27
    • 1970-01-01
    • 2011-10-08
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多