【问题标题】:windows – Qt create and use self-made static librarywindows - Qt 创建和使用自制静态库
【发布时间】:2017-12-19 09:25:09
【问题描述】:

有几个问题似乎很相似,但没有什么能真正帮助我。我想在一个项目中创建一个静态库并在同一个项目中使用它,但出现链接错误。

一个很好的例子,非常符合我的条件,附在Qt Ticket QTBUG-45706 https://bugreports.qt.io/browse/QTBUG-45706。在一个简单的解释中,我们有一个应该使用一些自制库的应用程序。只需修改一些内容即可查看我的问题。

应用程序-> main.cpp

#include <QCoreApplication>
#include <lib.h>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  Lib l1;

  return a.exec();
}

lib.pro

CONFIG += staticlib

如果你现在编译项目,你会看到如下错误

main.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl Lib2::Lib2(void)" (__imp_??0Lib2@@QEAA@XZ) referenced in function main

使用基于Qt 5.6.1的Qt Creator 4.0.3,qmake配合mscv2013

需要什么来实现这个功能?

澄清:

项目结构如下:

subdirs_test.pro (subdir project)
\- app (app project, includes lib and lib2)
\-- app.pro
\-- main.cpp
\- lib (static library)
\-- lib.pro
\-- lib.h
\-- lib_global.h
\-- lib.cpp
\- lib2 (static library)
\-- lib2.pro
\-- lib2.h
\-- lib2_global.h
\-- lib2.cpp

“app”项目应使用 lib 和 lib2 中的类,它们是静态库。

按照建议,使用“添加库...”不会改变任何事情。就我而言,将生成此代码。

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../lib/release/ -llib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../lib/debug/ -llib
else:unix: LIBS += -L$$OUT_PWD/../lib/ -llib

INCLUDEPATH += $$PWD/../lib
DEPENDPATH += $$PWD/../lib

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/release/liblib.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/debug/liblib.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/release/lib.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/debug/lib.lib
else:unix: PRE_TARGETDEPS += $$OUT_PWD/../lib/liblib.a

【问题讨论】:

  • 不清楚您要做什么。您必须设置至少 2 个 .pro 文件。一个用于库,一个用于应用程序。在应用程序一中将库输出路径添加到INCLUDESLIBS 变量。通常你还有一个第三个子目录项目来捆绑在一起
  • DONT use the Q_DECL_IMPORT macro with static libraries,宏只用于共享的windows库。这是我的一位同事的重要说明。宏通常隐藏在其他一些全局头文件中。

标签: c++ qt static-libraries


【解决方案1】:

您可以使用 QtCreators Subdirs 项目。以下是如何使用 QtCreator 实现这一目标的详细分步说明。

  • New Project 向导菜单中选择Subdirs Project

  • 通过右键单击创建的 Subdirs 项目添加子项目 鼠标按钮并选择New Subproject...

  • 按照向导,您应该有一个 GUI 或控制台子项目,并且 图书馆子项目。然后单击要链接的子项目 使用鼠标右键选择您的库子项目并选择Add Library...

  • 在对话框中选择Internal library,系统会提示您 选择您要添加的库。

  • 确保您的库子项目包含在 gui/console 之前 子项目作为子目录项目将无法构建。

    模板 = 子目录

    子目录 += \ 库项目\ 核心项目

【讨论】:

  • 感谢您的详细描述,这很有帮助!不幸的是,这不起作用,找不到依赖...但是在添加 CoreProject.depends = LibProject 之后它起作用了。有趣的问题是,为什么它在我自己的项目中不起作用?我会仔细检查所有内容,看看是否能找到任何不同之处。
  • @sandkasten 您是否完成了更改SUBDIRS 包含订单的最后一步。因为 QtCreator 会生成预目标依赖项PRE_TARGETDEPS += $$OUT_PWD/../LibProject/debug/LibProject.lib 并且不满足它们,所以您的构建将失败。
  • 是的,我更改了 SUBDIRS 包含顺序,但如果我删除依赖项,则构建失败。但我认为这是我的主要问题,由于某种原因构建顺序不正确,lib 不会被构建并且无法链接。但是PRE_TARGETDEPS 在那里(在 CoreProject 中)
  • 右键单击每个子项目,然后单击构建。有时 subdir 项目可能有点问题。您是否按照我的指示创建了包含库和应用程序子项目的最小子目录项目?它给你同样的错误吗? minimal reproducible example
  • 确保每次更改 .pro 文件中的某些内容时都重新运行 qmake
【解决方案2】:

您可以尝试执行后续步骤吗:

  1. 项目右键
  2. 添加库
  3. 选择类型(外部或其他)
  4. 在静态上设置标志,像这样picture

【讨论】:

  • 已经试过了,没有任何改变。生成了一堆额外的代码,但链接器错误仍然存​​在。如果这有帮助,我可以添加生成的代码。
  • 用结果更新我的问题,因为它太长了,无法评论
  • @sandkasten 你可以尝试为你的库制作一个 .pro 和任何 .pri,并在 .pro 中写入类似 include($$PWD/lib1.pri) 的内容并在此 .pri 文件中写入 LIBS +=
  • 对不起,我对 Qt 很陌生,不知道你的意思。你能解释我该怎么做吗?
  • @sandkasten 检查信息thisthisthisthis :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多