ошибка LNK2019: неразрешенный внешний символ Direct Sound

Итак, я читаю «Начало программирования третьего издания» Джонатана С. Харбора, и я дошел до того, что он учит нас, как использовать Direct Sound. В книге используются собственные файлы DirectSound.h и DirectSound.cpp, которые были из предыдущего выпуска DirectX SDK, но когда я пытаюсь скомпилировать, я получаю ошибку «LNK2019: неразрешенный внешний символ».

1> DirectSound.obj: ошибка LNK2019: неразрешенный внешний символ
_DXTraceA @ 20 ссылка в функции «public: long thiscall CSoundManager :: Initialize (struct HWND *, unsigned long) «(? Initialize @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)

1> DirectSound.obj: ошибка LNK2019: неразрешенный внешний символ
_DirectSoundCreate8 @ 12 ссылка на функцию «public: long thiscall CSoundManager :: Initialize (struct HWND *, unsigned long) «(? Initialize @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)

Я еще не реализовал код Direct Sound в своем проекте, просто наличие этих файлов приводит к тому, что проект не компилируется. Без них проект компилируется и работает отлично.

#ifndef DSUTIL_H
#define DSUTIL_H

#include <windows.h>
#include <mmsystem.h>
#include <mmreg.h>
#include <dsound.h>

class CSoundManager;
class CSound;
class CStreamingSound;
class CWaveFile;

#define WAVEFILE_READ   1
#define WAVEFILE_WRITE  2

#define DSUtil_StopSound(s)         { if(s) s->Stop(); }
#define DSUtil_PlaySound(s)         { if(s) s->Play( 0, 0 ); }
#define DSUtil_PlaySoundLooping(s)  { if(s) s->Play( 0, DSBPLAY_LOOPING ); }//-----------------------------------------------------------------------------
// Name: class CSoundManager
// Desc:
//-----------------------------------------------------------------------------
class CSoundManager
{
protected:
LPDIRECTSOUND8 m_pDS;

public:
CSoundManager();
~CSoundManager();

HRESULT Initialize(HWND  hWnd, DWORD dwCoopLevel);
inline  LPDIRECTSOUND8 GetDirectSound() { return m_pDS; }
HRESULT SetPrimaryBufferFormat( DWORD dwPrimaryChannels, DWORD dwPrimaryFreq, DWORD dwPrimaryBitRate );

HRESULT Create( CSound** ppSound, LPTSTR strWaveFileName, DWORD dwCreationFlags = 0, GUID guid3DAlgorithm = GUID_NULL, DWORD dwNumBuffers = 1 );
};//-----------------------------------------------------------------------------
// Name: class CSound
// Desc: Encapsulates functionality of a DirectSound buffer.
//-----------------------------------------------------------------------------
class CSound
{
protected:
LPDIRECTSOUNDBUFFER* m_apDSBuffer;
DWORD                m_dwDSBufferSize;
CWaveFile*           m_pWaveFile;
DWORD                m_dwNumBuffers;
DWORD                m_dwCreationFlags;

HRESULT RestoreBuffer( LPDIRECTSOUNDBUFFER pDSB, BOOL* pbWasRestored );

public:
CSound( LPDIRECTSOUNDBUFFER* apDSBuffer, DWORD dwDSBufferSize, DWORD dwNumBuffers, CWaveFile* pWaveFile, DWORD dwCreationFlags );
virtual ~CSound();

HRESULT FillBufferWithSound( LPDIRECTSOUNDBUFFER pDSB, BOOL bRepeatWavIfBufferLarger );
LPDIRECTSOUNDBUFFER GetFreeBuffer();

HRESULT Play( DWORD dwPriority = 0, DWORD dwFlags = 0, LONG lVolume = 0, LONG lFrequency = -1, LONG lPan = 0 );
HRESULT Stop();
HRESULT Reset();
BOOL    IsSoundPlaying();
};//-----------------------------------------------------------------------------
// Name: class CWaveFile
// Desc: Encapsulates reading or writing sound data to or from a wave file
//-----------------------------------------------------------------------------
class CWaveFile
{
public:
WAVEFORMATEX* m_pwfx;        // Pointer to WAVEFORMATEX structure
HMMIO         m_hmmio;       // MM I/O handle for the WAVE
MMCKINFO      m_ck;          // Multimedia RIFF chunk
MMCKINFO      m_ckRiff;      // Use in opening a WAVE file
DWORD         m_dwSize;      // The size of the wave file
MMIOINFO      m_mmioinfoOut;
DWORD         m_dwFlags;
BOOL          m_bIsReadingFromMemory;
BYTE*         m_pbData;
BYTE*         m_pbDataCur;
ULONG         m_ulDataSize;
CHAR*         m_pResourceBuffer;

protected:
HRESULT ReadMMIO();
HRESULT WriteMMIO( WAVEFORMATEX *pwfxDest );

public:
CWaveFile();
~CWaveFile();

HRESULT Open( LPTSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags );
HRESULT Close();

HRESULT Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead );
HRESULT Write( UINT nSizeToWrite, BYTE* pbData, UINT* pnSizeWrote );

DWORD   GetSize();
HRESULT ResetFile();
WAVEFORMATEX* GetFormat() { return m_pwfx; };
};
#endif // DSUTIL_H
///////////////////////////////////////////////////////////////////////////////
// The function that causes the error

HRESULT CSoundManager::Initialize(HWND hWnd, DWORD dwCoopLevel)
{
HRESULT hr;

SAFE_RELEASE(m_pDS);

// Create IDirectSound using the primary sound device
if(FAILED(hr = DirectSoundCreate8(NULL, &m_pDS, NULL)))
return DXTRACE_ERR(TEXT("DirectSoundCreate8"), hr);

// Set DirectSound coop level
if( FAILED( hr = m_pDS->SetCooperativeLevel( hWnd, dwCoopLevel ) ) )
return DXTRACE_ERR( TEXT("SetCooperativeLevel"), hr );

return S_OK;
}

1

Решение

Ошибка LNK2019 о добавлении отсутствующей библиотеки — типичная проблема. Вы должны определить отсутствующие символы, затем указать библиотеку для дополнительной ссылки, а затем добавить ее, используя #pragma или через настройки проекта.

Кроме того, поскольку это вопрос новичка, скорее всего, переполнение стека уже имеет что-то тесно связанное. Обязательно запустите поиск, сравните фрагменты кода с вашими.

Связанные вопросы показывают, что вам нужно связать dsound.lib и dxerr.lib.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]