【问题标题】:Qt link library error: "cannot find -lmylib"Qt 链接库错误:“找不到 -lmylib”
【发布时间】:2020-12-19 16:35:31
【问题描述】:

大家好,我正在学习 qt5 并尝试制作自己的共享库;我遵循了我可以在网上找到的大多数教程,但这是一个我无法解决的链接错误。这是文件结构:

我创建了一个名为 QTest2 的子目录项目,并添加了一个测试项目“mytest”和库项目“mylib”;然后通过单击“mytest”上的“添加库”->“内部库”,该库应该链接到它。请看代码:

mylib.pro:

QT -= gui

TEMPLATE = lib
DEFINES += MYLIB_LIBRARY

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    mylib.cpp

HEADERS += \
    mylib_global.h \
    mylib.h

# Default rules for deployment.
unix {
    target.path = /usr/lib
}
!isEmpty(target.path): INSTALLS += target

mylib.h:

#ifndef MYLIB_H

#define MYLIB_H

#include "mylib_global.h"
#include <QDebug>

class MYLIB_EXPORT Mylib
{
public:
    Mylib();
    int test();
};

#endif // MYLIB_H

mylib_global.h:

#ifndef MYLIB_GLOBAL_H
#define MYLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYLIB_LIBRARY)
#  define MYLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYLIB_EXPORT Q_DECL_IMPORT
#endif

#endif // MYLIB_GLOBAL_H

mylib.cpp:

#include "mylib.h"

Mylib::Mylib()
{
}

int Mylib::test()
{
    qDebug()<<"Hello World"<<endl;

    int sum = 0;
    for(int i = 0; i < 10; i++) {
        sum += i;
    }

    qDebug()<<sum<<endl;

    return sum;
}

mytest.pro

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../mylib/release/ -lmylib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../mylib/debug/ -lmylib

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

main.cpp:

#include <QCoreApplication>
#include <QDebug>

#include "../mylib/mylib_global.h"
#include "../mylib/mylib.h"

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


    Mylib mylib;

    int result = mylib.test();

    qInfo() << result << endl;

    return a.exec();
}

我很确定我没有错过教程中的任何步骤,并且还尝试重建项目,但每次我刚得到

:-1: error: cannot find -lmylib
:-1: error: collect2.exe: error: ld returned 1 exit status

平台:Qt 5.14、Qt Creator 4.11.0、Windows 10

任何建议将不胜感激。我已经被困了好几天了:(

【问题讨论】:

    标签: c++ qt qt5


    【解决方案1】:

    我建议你不要使用 Qt 的导出/导入宏。您可以在不使用宏的情况下导出每个符号(类、方法...)。从class MYLIB_EXPORT Mylib#ifndef MYLIB_H#define MYLIB_H 中删除mylib_global.hMYLIB_EXPORT

    首先你必须创建共享库:

    #library.pro
    TARGET = libraryName
    TEMPLATE = lib
    CONFIG += c++11 warn_off
    DESTDIR = $$PWD/lib
    
    INCLUDEPATH += path/to/source
    include(path/to/source/source.pri)
    

    source.pri 可能具有以下结构:

    HEADERS += \
        $$PWD/mylib.h
    
    SOURCE += \
         $$PWD/mylib.cpp
    

    重建library.pro,共享库将在DESTDIR中创建。然后,您必须像在 mytest.pro 中那样链接库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多