ошибка 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;
}

person L.Moyer    schedule 17.12.2016    source источник
comment
1 вы должны были включить полное сообщение об ошибке 2 добавить #pragma comment(lib, "dsound.lib"); строку следующим образом: не" title="приложение работает в Visual Studio, но выпуск отладочного exe не работает"> stackoverflow.com/questions/15543918/   -  person Roman R.    schedule 17.12.2016
comment
Я забыл добавить это. Он был отредактирован, чтобы перечислить ошибку.   -  person L.Moyer    schedule 17.12.2016
comment
Добавление .lib (см. выше) исправит вторую ошибку. Для первого см. stackoverflow .com/questions/9392252/   -  person Roman R.    schedule 17.12.2016
comment
Благодарю вас! Я даже не подумал добавить файлы .lib в файл, не говоря уже о том, что нужно будет включить файл DxErr.lib. Теперь он компилируется, и я наконец-то могу закодировать Direct Sound. Спасибо еще раз!   -  person L.Moyer    schedule 17.12.2016
comment
Имейте в виду, что DirectSound и сам DirectX SDK являются устаревшими. См. Где находится DirectX SDK?.   -  person Chuck Walbourn    schedule 18.12.2016
comment
Да, я использую только выпуск DirectX SDK от июня 2010 года, потому что в книге используется DirectX 9, и я рекомендовал его, чтобы я мог следовать и запускать примеры проверки концепции. Я закончил свой Pong Clone после того, как этот вопрос был решен.   -  person L.Moyer    schedule 18.12.2016


Ответы (1)


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

Кроме того, поскольку это вопрос для начинающих, скорее всего, Stack Overflow уже имеет что-то тесно связанное. Всегда обязательно запускайте поиск по нему, сравнивайте фрагменты кода со своим.

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

person Roman R.    schedule 17.12.2016