windows – Qt创建和使用自制静态库
windows – Qt create and use self-made static library
有几个问题看起来很相似,但没有什么能真正帮助我解决问题。我想在一个项目中创建一个静态库并在同一个项目中使用它,但是出现链接错误。
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 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
'app' 项目应该使用 lib 和 lib2 中的 类,它们是静态库。
按照建议,使用 "Add Library..." 不会改变任何事情。在我的例子中,将生成此代码。
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
您可以尝试执行后续步骤吗:
- 项目上的右键
- 添加图书馆
- 选择类型(外部或其他)
- 在静态上设置标志,像这样picture
您可以使用 QtCreators Subdirs 项目。以下是如何使用 QtCreator 实现这一目标的详细分步说明。
- 从
New Project
向导菜单中选择 Subdirs Project
。
- 通过右击创建的子目录项目添加子项目
鼠标按钮和 selecting
New Subproject...
.
- 按照向导,您应该有一个 GUI 或控制台子项目,并且
图书馆子项目。然后点击你想要 link 的子项目
你的库子项目用鼠标右键和 select
Add
Library...
.
- Select
Internal library
在对话框中,系统将提示您
选择你要添加的库。
确保你的库子项目在 gui/console 之前被包含
作为 subdir 项目的子项目将无法构建。
模板 = 子目录
子目录 += \
图书馆项目\
核心项目
有几个问题看起来很相似,但没有什么能真正帮助我解决问题。我想在一个项目中创建一个静态库并在同一个项目中使用它,但是出现链接错误。
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 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
'app' 项目应该使用 lib 和 lib2 中的 类,它们是静态库。
按照建议,使用 "Add Library..." 不会改变任何事情。在我的例子中,将生成此代码。
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
您可以尝试执行后续步骤吗:
- 项目上的右键
- 添加图书馆
- 选择类型(外部或其他)
- 在静态上设置标志,像这样picture
您可以使用 QtCreators Subdirs 项目。以下是如何使用 QtCreator 实现这一目标的详细分步说明。
- 从
New Project
向导菜单中选择Subdirs Project
。
- 通过右击创建的子目录项目添加子项目
鼠标按钮和 selecting
New Subproject...
.
- 按照向导,您应该有一个 GUI 或控制台子项目,并且
图书馆子项目。然后点击你想要 link 的子项目
你的库子项目用鼠标右键和 select
Add Library...
.
- Select
Internal library
在对话框中,系统将提示您 选择你要添加的库。
确保你的库子项目在 gui/console 之前被包含 作为 subdir 项目的子项目将无法构建。
模板 = 子目录
子目录 += \ 图书馆项目\ 核心项目