【发布时间】: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 文件。一个用于库,一个用于应用程序。在应用程序一中将库输出路径添加到
INCLUDES和LIBS变量。通常你还有一个第三个子目录项目来捆绑在一起 -
DONT use the Q_DECL_IMPORT macro with static libraries,宏只用于共享的windows库。这是我的一位同事的重要说明。宏通常隐藏在其他一些全局头文件中。
标签: c++ qt static-libraries