【问题标题】:Using a static library in Qt Creator在 Qt Creator 中使用静态库
【发布时间】:2010-11-24 13:51:16
【问题描述】:

我正在寻找清楚地解释如何在 Qt Creator 中使用静态库的文档。

我已经使用 Qt Creator 创建并编译了我的静态库(New=>Projects\C++ Library=>将类型设置为“静态链接库”)。它编译并输出一个“.a 文件”。

我遇到的问题是当我尝试使用该库时。我有另一个想要使用它的项目(库中的#include 文件等),但我不知道与库链接或包含库中的文件的正确方法。

【问题讨论】:

    标签: c++ linker static-libraries qt-creator


    【解决方案1】:
    LIBS += -L[path to lib] -l[name of lib]
    

    注意! lib 的文件名:lib[nameOfLib].a 并且您只需要传递原始部分 -l[nameOfLib]

    【讨论】:

    • 我在发布后不久在doc.trolltech.com/4.5/… 找到了答案(一直在谷歌上搜索有关创作者的愚蠢内容,而不仅仅是徘徊在 qmake 文档中)。我仍然不知道 -L 或 -l 是什么意思,但这就是 makefile 的本质。命令行 gobbl-dee-gook 可以很容易地解析为...命令行 gobble-dee-gook。 RPG 的答案也很重要,includepath 的东西很重要。我将你的答案标记为正确,因为 -L/-l 似乎也很重要!
    • 这对我不起作用,但这里有另一个答案,即在编辑 .pro 文件并使用“添加库”用户界面时右键单击。
    【解决方案2】:

    ..来自 QT 项目创建者

    1. 从左侧菜单转到 projectName.pro
    2. 输入 LIBS +=
    3. 右键单击添加库

    【讨论】:

    • 不需要输入LIBS +=。您可以将其缩短为 2 个步骤。
    • 实际上,这是我可以从所有答案中得出的唯一解决方案。正如 andrewrk 所建议的,您不需要键入 LIBS +=。您只需要转到 .pro 文件,右键单击,添加库,然后让 QtCreator 生成所需的代码行(顺便说一句,在我的系统 [Qt 5.4,Linux] 上,它看起来与其他建议的完全不同答案。)
    • 尽管这样做了,并选择了正确的 static 库,但我仍然保持动态链接。 Temac 的回答很有帮助。
    【解决方案3】:

    在您使用该库的项目中,将LIBS 变量指向您的库路径。
    要包含库中的文件,请将库文件夹添加到INCLUDEPATH,然后在代码文件中执行常规#include。

    例如:

    # the binary's .pro  
    LIBS += c:/mylibs/math.lib
    INCLUDEPATH += c:/mylibs
    

    已编辑:
    -L 告诉 qmake 路径是一个可以搜索库的目录 -l 告诉它路径是一个文件,但是注意下面的观察。

    来自 qmake 文档:

    这个变量包含一个列表 要链接到的库 项目。您可以使用 Unix -l (库)和 -L(库路径)标志 qmake 会做正确的事 在 Windows 上使用这些库 (即这意味着通过完整的 库到链接器的路径)。 唯一的限制是 库必须存在,qmake 才能找到 -l lib 位于哪个目录。

    注意:在 Windows 上,指定库 使用 -l 选项,如上 例如,将导致库与 要使用的最高版本号; 例如,libmath2.lib 可以 可能被用来代替 数学库。为了避免这种歧义, 我们建议您明确 指定要使用的库 包括 .lib 文件名后缀。

    【讨论】:

    • 感谢您发布此答案。以下是 Qt5 文档中指向 LIBS 和 INCLUDEPATH 变量的链接:LIBSINCLUDEPATH
    【解决方案4】:

    变种

     LIBS += -L[PATH_TO_LIB_DIR] -l[LIBNAME] 
    

    如果您在同一文件夹 PATH_TO_LIB_DIR 中同时拥有静态 libLIBNAME.a 和动态 libLIBNAME.so 库,则不起作用。
    在这种情况下,在我的 linux 上使用 QMake v 3.0 动态的默认链接。
    强制与静态链接,您需要明确指定它而无需任何选项。

    LIBS += PATH_TO_LIB_DIR/libLIBNAME.a
    

    【讨论】:

    • 我注意到了一些类似的情况:如果在同一个文件夹中有 module.dlllibmodule.a,并且我将 dll 包含在 -L<path> -l<name> 中,我会收到多重定义错误。但是,如果我删除静态库文件(.a),那么它就可以工作。不确定这是巧合还是预期的行为......
    • 这是唯一有人解释了如果在同一目录中找到 .so 时如何强制链接器使用 .a
    • 这是唯一有助于获得库静态链接的答案。谢谢!
    【解决方案5】:

    是吗

    LIBS += -L"/some path" -l"somename.a"
    

    LIBS += -L/somepath -lsomename.a
    

    LIBS += -L/somepath -lsomename"
    

    这应该尽可能简单,但由于某种原因,很难找到搜索结果,因为有很多人在寻求帮助的论坛点击量很大,而且我已经按照我能得到的每一个提示进行操作,但是没救了……

    【讨论】:

    • 你会在Dewfy answer中找到你的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多