0

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

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は私に与えます:

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
4

3 に答える 3

1

In loadTestLib.pro のLIBS行が間違っています。そのはず

LIBS+=-L.. -ltest

または、わかりやすくするために、これを 2 行に配置することもできます (スペースも使用します)。

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

これは ../libtest.so にリンクすることに注意してください。通常、ビルド時にはバージョン サフィックスのないファイルにリンクし、実行時にはバージョン番号のあるファイルにリンクします。

于 2013-04-22T19:27:13.797 に答える
0

Troubadour が言ったことに加えて、lib を見つけることができる場所をリンカに伝える必要があります。.pro ファイルに QMAKE_LIBDIR を設定するか、ライブラリを含むディレクトリを追加してコマンド/etc/ld.so.confを使用できますldconfig

于 2013-04-23T08:29:04.867 に答える
0

ライブラリへのWindowsの絶対パスと.dllを含む名前は私にとってはうまくいきました。Ubuntuでも同じ方法で正常にコンパイルされますが、アプリケーションは/usr/libに配置した場合にのみライブラリを見つけます

于 2013-04-24T17:04:25.363 に答える