Reputation: 9
I'm studying linking shared libraries in QT, tried tutorials but nothing works. Can somebody help me to find a mistake?
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:
#-------------------------------------------------
#
# 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
Library:
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
}
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:
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
Upvotes: 0
Views: 11882
Reputation: 13421
Your LIBS
line in In loadTestLib.pro is wrong. It should be
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.
Upvotes: 1
Reputation: 9
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
Upvotes: 0
Reputation: 964
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.
Upvotes: 0