2013-04-22 3 views
1

Я изучаю связывание разделяемых библиотек в QT, пробовал учебники, но ничего не работает. Может ли кто-нибудь помочь мне найти ошибку?QT shared library undefined ссылка на

У меня есть ошибка «Неопределенная ссылка на тест», когда я компилирую свой тестовый проект.

проекта, в котором я пытаюсь связать свою 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 

тест .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 
} 

Compile выход:

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 'Сборка' 

$ нм -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 
+0

Не следует ли это помечать как QMake вместо CMake? – drescherjm

+0

Да. Спасибо. – madmaker

+0

У вас есть библиотека, построенная успешно? и если да, то правильное местоположение вывода (относительно основного приложения)? – evilruff

ответ

0

Ваш LIBS линия В loadTestLib.pro неправильно. Он должен быть

LIBS+=-L.. -ltest 

В качестве альтернативы вы можете поставить это на двух строках (и использование пространств тоже) для ясности

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

Обратите внимание, что это будет компоноваться с ../libtest.so. Как правило, вы ссылаетесь на файл без суффикса версии во время сборки и файл с номером версии во время выполнения.

+0

Теперь я получаю эту ошибку: /USR/BIN/LD: не может найти -ltest делают: Оставляя каталог '/ главная/Bonart/Workspace/тест/loadTestLib-билд-Desktop_Qt_5_0_1_GCC_64bit -_______» collect2: ld вернулся 1 статус выхода make: *** [loadTestLib] Ошибка 1 – madmaker

+0

Хорошо, я написал 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 - все работает. Знаете ли вы, почему приложение не может видеть lib в его папке? Я использую Ubuntu. – madmaker

+0

@madmaker: Сначала пара очков. 1. Глядя на вывод сборки, добавленный в ваш вопрос, похоже, что перед '-ltest' вам не хватает пробела. 2. Если вы передаете относительный путь к '-L', убедитесь, что он правильный относительно того, где вызывается' g ++ '. Теперь на ваш вопрос о запуске приложения. Связывание времени выполнения отличается от компоновки времени. Первый выполняется с помощью 'ld.so' в Linux, и вы захотите проконсультироваться с этой страницей' man' для вашей системы. Обычно самый простой способ - это добавить правильный путь к переменной 'LD_LIBRARY_PATH'. – Troubadour

0

В дополнение к тому, что сказал Трубадур, вы должны сообщить линкеру, где он может найти lib. Вы можете установить QMAKE_LIBDIR в .pro-файл или добавить каталог, содержащий вашу библиотеку, в /etc/ld.so.conf и использовать команду ldconfig.

+0

Теперь снова я получаю сообщение об ошибке «Неопределенная ссылка на Test :: test()». Ничего не изменилось. И я заметил, что я пишу «LIBS + = - L ../- ltest» - без пробелов - это «неопределенная ссылка». Если я пишу «LIBS + = - L ../ -ltest» - с пробелом, я получаю сообщение об ошибке «не могу найти -ltest». Что случилось? – madmaker

+0

Пожалуйста, предоставьте полное сообщение об ошибке для неопределенной ссылки – SpongeBobFan

+0

Я добавил компиляцию вывода на мой вопрос сверху – madmaker

0

В Windows абсолютный путь к библиотеке и его имя с .dll сработали для меня. В Ubuntu он также успешно скомпилирован, но приложение находит библиотеку, только если вы положили ее в/usr/lib