2017-07-14 57 views
1

有几个问题似乎是相似的,但没有什么能真正帮助我。我想在一个项目中创建一个静态库并在同一个项目中使用它,但会发生链接错误。窗口-Qt创建并使用自制的静态库

一个很好的例子,很好地满足了我的条件是附加到Qt票务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)" ([email protected]@[email protected]) referenced in function main 

使用Qt创建者4.0.3基于Qt 5.6.1,qmake with 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 

的 '应用' 项目应当使用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 
+1

目前还不清楚是什么你正在尝试做的。您必须设置至少2个.pro文件。一个用于lib和一个用于应用程序。在应用程序中,将库输出路径添加到“INCLUDES”和“LIBS”变量中。 通常你也有第三个subdir项目,把所有的东西绑在一起 – IlBeldus

+1

[不要使用Q_DECL_IMPORT宏和静态库](https://forum.qt.io/topic/25328/static-library/8),宏是仅用于共享Windows库。这是来自我的一位同事的重要说明。宏通常隐藏在其他全局头文件中。 – sandkasten

回答

1

你可以使用QtCreators Subd irs项目。以下详细介绍如何通过QtCreator实现这一目标。

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

Subdirs Project

  • 通过点击创建子目录项目右 鼠标按钮并选择New Subproject...添加Subrojects。

New Subproject

  • 通过下列向导,你应该有一个GUI或控制台子项目和 库子项目。然后点击您想要使用鼠标右键链接 库子项目的子项目并选择Add Library...

Add Library

  • 选择Internal library在对话框中,你会被提示选择 要添加库。

Internal library

  • 确保您的图书馆子项目之前GUI /控制台 子项目包括作为子目录项目将无法建立。

    模板=子目录

    SUBDIRS + = \ LibProject \ CoreProject

+0

感谢您的详细描述,这非常有帮助!不幸的是,这是行不通的,找不到依靠... 但是,在添加'CoreProject.depends = LibProject'后,它的工作。 intresstig问题是,为什么它不在我自己的项目中工作?我会仔细检查一切,看看能否找到任何区别。 – sandkasten

+0

@sandkasten你做了最后一步改变'SUBDIRS'包括订单。由于QtCreator生成预先目标依赖关系'PRE_TARGETDEPS + = $$ OUT_PWD /../ LibProject/debug/LibProject.lib'并且不符合它们,您的构建将失败。 –

+0

是的,我改变了'SUBDIRS'包括顺序,但是如果我删除了依赖,构建失败。但我认为这是我的主要问题,由于某些原因,构建顺序不正确,lib将不会被构建并且无法链接。但'PRE_TARGETDEPS'在那里(在CoreProject中) – sandkasten

1

你能尝试做下面的步骤:

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

已经尝试过这个,不会改变一件事情。生成一堆额外的代码,但链接器错误仍然存​​在。如果这样的话,我可以添加生成的代码。 – sandkasten

+0

@sandkasten显示此代码:) – iMashine

+0

更新我的问题的结果,因为它的评论时间太长 – sandkasten