QT共享库未定义对的引用

QT共享库未定义对的引用,qt,shared-libraries,qt-creator,qmake,qt5,Qt,Shared Libraries,Qt Creator,Qmake,Qt5,我正在学习QT中的链接共享库,尝试过教程,但没有任何效果。 有人能帮我找出一个错误吗 我在编译测试项目时出现了一个错误“未定义对测试的引用” 我尝试链接我的库的项目: loadTestLib.pro: #------------------------------------------------- # # Project created by QtCreator 2013-04-22T15:32:30 # #------------------------------------------

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

我在编译测试项目时出现了一个错误“未定义对测试的引用”

我尝试链接我的库的项目: 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:

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

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

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
#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
测试h:

#ifndef TEST_H
#define TEST_H

#include "test_global.h"

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

#endif // TEST_H
#ifndef TEST_H
#define TEST_H

#include "test_global.h"

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

#endif // TEST_H
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
}
编译输出:

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用于我的库,为我提供:

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

loadTestLib.pro中的
LIBS
行错误。应该是

LIBS+=-L.. -ltest
或者,为了清晰起见,您可以将其放在两行上(也可以使用空格)

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

请注意,这将链接到../libtest.so。通常,您在构建时链接不带版本后缀的文件,在运行时链接带有版本号的文件。

除了Troubadour所说的,您还应该告诉链接器在哪里可以找到库。您可以在.pro文件中设置QMAKE_LIBDIR,或者将包含库的目录添加到
/etc/ld.so.conf
中,并使用
ldconfig
命令。

在Windows中,库的绝对路径及其名称与.dll一起工作。
在Ubuntu中,它也是以同样的方式成功编译的,但应用程序只有在您将它放在/usr/lib

时才能找到库。这个库不应该被标记为QMake而不是CMake吗?您成功地构建了库吗?如果是,那么输出位置是否正确(相对于主应用程序)?是的,它是为未来的访问者成功构建的:
LIBS+=-L../libtest.so.1.0.0
是一个简单的错误,它会导致
libtest.so.1.0.0
无法输入链接。在对@Troubadour的回答进行更正后,OP发现该应用程序无法在运行时加载
libtest.so.1
,除非复制到加载程序的受信任目录之一
/usr/lib
。当然,如果不使用
LD\u LIBRARY\u PATH
ldconfig
,它就无法实现。这里没什么可看的。现在我得到了这个错误:/usr/bin/ld:找不到-ltest make:离开目录`/home/bonart/Workspace/test/loadTestLib-build-Desktop\u Qt\u 5\u 0\u 1\u GCC\u 64位-\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但当我运行应用程序时,控制台说它找不到“libtest.so.1”。当我将libtest.so、libtest.so.1、libtest.so.1.0、libtest.so.1.0.0放在/usr/lib中时,一切正常。你们知道为什么应用程序在它的文件夹中看不到库吗?我用Ubuntu。@madmaker:先说几点。1.查看添加到问题中的构建输出,您似乎缺少
-ltest
之前的空格。2.如果将相对路径传递给
-L
,请确保相对于调用
g++
的位置它是正确的。现在,请回答有关运行应用程序的问题。运行时链接与构建时链接不同。前者由
ld完成。因此
在Linux上,您需要在系统上查阅
man
页面。通常最简单的方法是将正确的路径添加到
LD\u LIBRARY\u path
环境变量中。现在,我再次遇到一个错误“未定义对Test::Test()的引用”。没有什么变化。我注意到如果我写“LIBS+=-L../-ltest”-没有空格-它是“未定义的引用”。如果我用空格写“LIBS+=-L../-ltest”,我会得到一个错误“找不到-ltest”。怎么了?我在顶部的问题中添加了编译输出。看起来一切正常,请尝试使用
nm
util查看库导出函数是否正常。您还可以尝试使用
qmake&&makeclean&&make
重新构建项目。好的,我已经编写了LIBS+=“lib/libtest.so.1.0.0的绝对路径”,现在它已成功编译。但当我运行应用程序时,控制台说它找不到“libtest.so.1”。当我将libtest.so、libtest.so.1、libtest.so.1.0、libtest.so.1.0.0放在/usr/lib中时,一切正常。你们知道为什么应用程序在它的文件夹中看不到库吗?我使用Ubuntu。你可以将lib文件夹添加到
/etc/ld.so.conf
(或者无论
ld.so.conf
放在哪里,我都记不清楚)。然后应该运行
ldconfig
。但若要更清楚地回答关于应用程序lib文件夹的问题,请访问谷歌,或者询问比我更熟悉linux编程的人,我不确定其他人是否会在这里看到您的评论。并尽量避免在
.pro
文件中使用绝对路径,您是否尝试过
QMAKE_LIBDIR=您的相对路径到_lib
LIBS += -L..
LIBS += -ltest