QT共享库未定义的引用。

时间:2022-11-21 05:30:12

I'm studying linking shared libraries in QT, tried tutorials but nothing works. Can somebody help me to find a mistake?

我正在学习在QT中链接共享库,尝试过一些教程,但是没有任何效果。有人能帮我找出错误吗?

I have an error "Undefined reference to test" when I'm compiling my test project.

在编译测试项目时,我有一个错误“未定义的引用”。

Project where i'm trying to link my lib: loadTestLib.pro:

我试图链接我的lib的项目:loadTestLib.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2013-04-22T15:32:30
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = loadTestLib
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp
LIBS+=-L../libtest.so.1.0.0

HEADERS += \
    test_global.h \
    test.h

main.cpp:

main.cpp:

#include <QCoreApplication>
#include "test.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Test test;
    return a.exec();
}

test_global.h:

test_global.h:

#ifndef TEST_GLOBAL_H
#define TEST_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(TEST_LIBRARY)
#  define TESTSHARED_EXPORT Q_DECL_EXPORT
#else
#  define TESTSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // TEST_GLOBAL_H

test.h:

test.h:

#ifndef TEST_H
#define TEST_H

#include "test_global.h"

class TESTSHARED_EXPORT Test
{
public:
    Test();
};

#endif // TEST_H

Library:

库:

test_global.h:

test_global.h:

#ifndef TEST_GLOBAL_H
#define TEST_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(TEST_LIBRARY)
#  define TESTSHARED_EXPORT Q_DECL_EXPORT
#else
#  define TESTSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // TEST_GLOBAL_H

test.cpp:

test.cpp:

#include "test.h"


Test::Test()
{
}

test.h:

test.h:

#ifndef TEST_H
#define TEST_H

#include "test_global.h"

class TESTSHARED_EXPORT Test
{
public:
    Test();
};

#endif // TEST_H

test.pro:

test.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2013-04-22T15:31:04
#
#-------------------------------------------------

QT       -= gui

TARGET = test
TEMPLATE = lib

DEFINES += TEST_LIBRARY

SOURCES += test.cpp

HEADERS += test.h\
        test_global.h

unix:!symbian {
    maemo5 {
        target.path = /opt/usr/lib
    } else {
        target.path = /usr/lib
    }
    INSTALLS += target
}

Compile output:

编译输出:

13:49:12: Running steps for project loadTestLib...
13:49:12: Configuration unchanged, skipping qmake step.
13:49:12: Starting: "/usr/bin/make" -w
make: Entering directory `/home/bonart/Workspace/test/loadTestLib-build-Desktop_Qt_5_0_1_GCC_64bit-_______'
/home/bonart/Qt5.0.1/5.0.1/gcc_64/bin/qmake -spec linux-g++-64 CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug -o Makefile ../loadTestLib/loadTestLib.pro
make: Leaving directory `/home/bonart/Workspace/test/loadTestLib-build-Desktop_Qt_5_0_1_GCC_64bit-_______'
make: Entering directory `/home/bonart/Workspace/test/loadTestLib-build-Desktop_Qt_5_0_1_GCC_64bit-_______'
g++ -m64 -Wl,-rpath,/home/bonart/Qt5.0.1/5.0.1/gcc_64 -Wl,-rpath,/home/bonart/Qt5.0.1/5.0.1/gcc_64/lib -o loadTestLib main.o   -L./libs -L../libs/-ltest -L/home/bonart/Qt5.0.1/5.0.1/gcc_64/lib -lQt5Core -lpthread 
main.o: In function `main':
/home/bonart/Workspace/test/loadTestLib-build-Desktop_Qt_5_0_1_GCC_64bit-_______/../loadTestLib/main.cpp:7: undefined reference to `Test::Test()'
make: Leaving directory `/home/bonart/Workspace/test/loadTestLib-build-Desktop_Qt_5_0_1_GCC_64bit-_______'
collect2: ld returned 1 exit status
make: *** [loadTestLib] Error 1
13:49:12: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project loadTestLib (kit: Desktop Qt 5.0.1 GCC 64bit)
When executing step 'Сборка'

$ nm -D for my library gives me:

$ nm -D为我的图书馆提供:

w _Jv_RegisterClasses
                 U _Unwind_Resume
                 U _Z17qt_message_output9QtMsgTypeRK18QMessageLogContextRK7QString
                 U _ZN10QArrayData10deallocateEPS_mm
                 U _ZN11QTextStreamD1Ev
                 U _ZN11QTextStreamlsERK7QString
                 U _ZN11QTextStreamlsEc
0000000000000bb0 T _ZN4TestC1Ev
0000000000000bb0 T _ZN4TestC2Ev
0000000000000d90 W _ZN6QDebugD1Ev
0000000000000d90 W _ZN6QDebugD2Ev
                 U _ZN7QString15fromUtf8_helperEPKci
                 U _ZNK14QMessageLogger5debugEv
                 U _ZTISt9bad_alloc
                 U _ZdlPv
0000000000202080 A __bss_start
                 U __cxa_begin_catch
                 U __cxa_end_catch
                 w __cxa_finalize
                 w __gmon_start__
                 U __gxx_personality_v0
0000000000202080 A _edata
0000000000202090 A _end
0000000000000ec8 T _fini
00000000000009e8 T _init

3 个解决方案

#1


0  

In addition to what Troubadour said, you should tell linker where it can find the lib. You can set QMAKE_LIBDIR in .pro file, or add directory that contain your library to /etc/ld.so.conf and use ldconfig command.

除了“Troubadour”所说的之外,您还应该告诉linker它可以在哪里找到lib。conf和使用ldconfig命令。

#2


0  

In Windows absolute path to library and it's name with .dll worked for me. In Ubuntu it's also compiled successfully with same way but application finds library only if you put it to /usr/lib

在Windows的绝对路径到库,它的名字和。dll为我工作。在Ubuntu中,它也以同样的方式成功编译,但是只有当你把它放到/usr/lib中,应用程序才会找到库。

#3


0  

Your LIBS line in In loadTestLib.pro is wrong. It should be

您的LIBS线在loadTestLib中。职业是错误的。它应该是

LIBS+=-L.. -ltest

Alternatively you can put this on two lines (and use spaces too) for clarity

另外,您也可以将此设置为两行(也可以使用空格)来表示清楚。

LIBS += -L..
LIBS += -ltest

Note that this will link against ../libtest.so. Generally you link against the file without a version suffix at build time and a file with a version number at runtime.

注意,这将链接到../ libtestso。通常,在构建时没有版本后缀的文件和运行时版本号的文件链接。

#1


0  

In addition to what Troubadour said, you should tell linker where it can find the lib. You can set QMAKE_LIBDIR in .pro file, or add directory that contain your library to /etc/ld.so.conf and use ldconfig command.

除了“Troubadour”所说的之外,您还应该告诉linker它可以在哪里找到lib。conf和使用ldconfig命令。

#2


0  

In Windows absolute path to library and it's name with .dll worked for me. In Ubuntu it's also compiled successfully with same way but application finds library only if you put it to /usr/lib

在Windows的绝对路径到库,它的名字和。dll为我工作。在Ubuntu中,它也以同样的方式成功编译,但是只有当你把它放到/usr/lib中,应用程序才会找到库。

#3


0  

Your LIBS line in In loadTestLib.pro is wrong. It should be

您的LIBS线在loadTestLib中。职业是错误的。它应该是

LIBS+=-L.. -ltest

Alternatively you can put this on two lines (and use spaces too) for clarity

另外,您也可以将此设置为两行(也可以使用空格)来表示清楚。

LIBS += -L..
LIBS += -ltest

Note that this will link against ../libtest.so. Generally you link against the file without a version suffix at build time and a file with a version number at runtime.

注意,这将链接到../ libtestso。通常,在构建时没有版本后缀的文件和运行时版本号的文件链接。