【问题标题】:QtCreator - Can't link against static library (ld error)QtCreator - 无法链接到静态库(ld 错误)
【发布时间】:2014-02-24 00:05:08
【问题描述】:

我在 Linux 上使用 QtCreator 3.0.1 和 Qt 5.2.1 时遇到问题。我正在尝试使用 QtCreator 内置的“构建”函数编译我的项目,我想它运行qmake project.pro,然后运行make。我的项目使用 QScintilla,我已将其编译为静态库 (.a),并包含在我的项目目录中 qscintilla/Qt4Qt5

编译完成后,编译输出面板显示如下:

/usr/bin/ld: cannot find -lqscintilla2
collect2: error: ld returned 1 exit status

我的.pro 文件包含:

LIBS += -Lqscintilla/Qt4Qt5 -lqscintilla2

但是,通过终端模拟器在项目的根目录上运行qmake 然后make 效果很好,并且项目编译和链接成功。我仔细检查了qscintilla/Qt4Qt5 目录是否包含文件libqscintilla2.a

【问题讨论】:

  • 您是否尝试过-l的绝对路径,例如-lqscintilla/Qt4Qt5/libqscintilla2.a?请显示整个链接器输出它试图执行的内容。
  • 您是否也在尝试将 qscintilla 库构建为项目的一部分,或者只是将其作为静态库包含在内?我认为没有任何理由这样做。
  • 不幸的是,@LaszloPapp 没有用。我觉得奇怪的是,通过终端运行make 可以完美运行,使用相同的.pro 文件和所有内容。
  • 您是否在终端和控制台中使用相同的构建文件夹?也许您可以按照下面的说明尝试“OUT_PWD”?

标签: c++ qt qt-creator qmake qscintilla


【解决方案1】:

由于您似乎使用的是 Linux,因此最好将软件包留在您的发行版中。安装将静态库引入系统的软件包会更“普通”。

但是,如果您希望坚持项目内构建原则,我建议不要禁用影子构建并创建其他有其自身局限性的解决方法。

例如,您可以为此目的使用$$OUT_PWD variable,但通常,您还需要在组件之间指定目标依赖关系。

那么,你会这样写:

LIBS += -L$$OUT_PWD/qscintilla/Qt4Qt5 -lqscintilla2

请根据您的目录布局进行调整。

【讨论】:

  • 是的,这是一个更好的解决方案。由于某种原因,使用OUT_PWD 不起作用,但_PRO_FILE_PWD_ 起作用(启用了影子构建)。编辑:我尝试使用qmake的message()函数打印变量,看起来PWD_PRO_FILE_PWD_指向项目的原始根目录,而OUT_PWD指向Qt生成的那个。
【解决方案2】:

您还应该添加以下行:

PRE_TARGETDEPS += qscintilla/Qt4Qt5/libqscintilla2.a

到您的 .pro 文件,以便静态链接库。

【讨论】:

  • @LaszloPapp 什么是更好的选择?现在,我可以下载最新版本的 QScintilla,将其保存在我的项目目录中,编译并静态链接。我觉得非常实用,如果作者发布新版本,我可以轻松替换文件。
【解决方案3】:

设法使其工作:在 QtCreator 上,单击左侧窗格上的“项目”,这将打开一个选项卡,允许您编辑构建/运行/样式选项。在 Build/General 部分,禁用“Shadow build”。这将在原始项目目录上构建项目。

编辑:查看@LaszloPapp 的答案以获得更好的解决方案。

【讨论】:

  • 这似乎是一种解决方法,但它也会禁用影子构建。无论如何,我仍然给这个问题+1。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2020-02-27
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2017-01-09
  • 2016-03-13
相关资源
最近更新 更多