1

私は C++ 共有ライブラリ ( libtest-lib.so ) を持っており、組み込み Linux プラットフォーム上の 2 つの Qt アプリ (アプリ A とアプリ B) によってリンクされています。アプリ A とアプリ B の両方で、libtest-lib.so から単一の共有ポインターを参照できるようにしたいと考えています。

libtest-lib.so は小さいです -

test-lib_global.h:

#ifndef TESTLIB_GLOBAL_H
#define TESTLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(TESTLIB_LIBRARY)
#  define TESTLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define TESTLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // TESTLIB_GLOBAL_H

testlib.h:

#ifndef TESTLIB_H
#define TESTLIB_H

#include "test-lib_global.h"

class TESTLIBSHARED_EXPORT TestLib
{
public:
    TestLib();

    // Notice that it is a reference
    TESTLIBSHARED_EXPORT static int& GetSingleInt();

    // Create a global audio buffer
    TESTLIBSHARED_EXPORT static signed short* getGlobalAudioBuffer();

};

#endif // TESTLIB_H

testlib.cpp:

#include "testlib.h"

int& TestLib::GetSingleInt()
{
    // keep the actual value as static to this function
    int min = 5;
    int max = 500;
    static int s_value(min + (rand() % (int)(max - min + 1)));

    // but return a reference so that everybody can use it
    return s_value;
}

// Create a global audio buffer
signed short* TestLib::getGlobalAudioBuffer() {

    // Create a static audio buffer
    static signed short* globalAudioBuffer = (signed short*)malloc( 1000 * sizeof(signed short) );

    return globalAudioBuffer;

}

TestLib::TestLib()
{
}

アプリ A とアプリ B はどちらも、主に次のことを行います。

int me = TestLib::GetSingleInt();
qDebug() << "SHARED INT IS: " << me;

signed short* audioBuffer = TestLib::getGlobalAudioBuffer();
qDebug() << "SHARED AUDIO BUFFER POINTER IS: " << &audioBuffer;

libtest-lib.so をデプロイし、アプリ A とアプリ B をビルドしてデプロイすると、次の出力が得られます。

アプリ A:

SHARED INT IS:  108 
SHARED AUDIO BUFFER POINTER IS:  0xbe844ac8

アプリ B:

SHARED INT IS:  108 
SHARED AUDIO BUFFER POINTER IS:  0xbeff0e64

int は同じですが、ポインタのアドレスが異なります。私は何を間違っていますか?ライブラリ関数から同一の共有ポインタを返すにはどうすればよいですか?

ありがとう -

4

1 に答える 1

4

それ自体は不可能です。各プロセスには、個別のアドレス空間があります。共有ライブラリは、実行時にメモリではなく、命令とデータを共有します。共有メモリを使用し、それに応じてプロセス間で同期する必要があります。Qt はQSharedMemoryを提供します。これは、プラットフォームに依存しない API を共有メモリの生のチャンクに提供し、同期のための基本的なセマフォベースのロック/ロック解除メカニズムを備えています。

または、パイプやソケットなど、別の IPC メカニズムを使用してオーディオ データをストリーミングします。プロセス間の相互作用の複雑さによっては、同期が非常に簡単になる場合があります。

于 2013-02-05T21:55:20.460 に答える