我正在学习在QT中链接共享库,尝试教程,但没有任何作用。有人能帮我找出错误吗?
当我编译我的测试项目时,我有一个错误"未定义的测试引用"。
项目,我试图链接我的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:
#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
test.h:
#ifndef TEST_H
#define TEST_H
#include "test_global.h"
class TESTSHARED_EXPORT Test
{
public:
Test();
};
#endif // TEST_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:
#include "test.h"
Test::Test()
{
}
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 for my library给我:
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
您的LIBS
行在in loadTestLib。亲是错的。应该是
LIBS+=-L.. -ltest
或者你可以把它放在两行(也使用空格),以清晰
LIBS += -L..
LIBS += -ltest
注意,这将链接到../libtest.so。通常在构建时链接不带版本后缀的文件,在运行时链接带版本号的文件。
除了Troubadour所说的,你应该告诉链接器在哪里可以找到这个库。您可以在.pro文件中设置QMAKE_LIBDIR,或者将包含库的目录添加到/etc/ld.so.conf
并使用ldconfig
命令。
在Windows的绝对路径库和它的名字与。dll为我工作。在Ubuntu中,它也以同样的方式成功编译,但是只有当你把它放到/usr/lib