简体   繁体   English

错误LNK2019:无法解析的外部符号直接声音

[英]error LNK2019: unresolved external symbol Direct Sound

So I'm reading "Beginning Game Programming Third Edition" by Jonathan S. Harbour, and I've gotten to the point where he teaches us how to use Direct Sound. 因此,我正在阅读乔纳森·S·哈伯(Jonathan S. Harbour)撰写的“ Beginning Game Programming Third Edition”(开始游戏编程第三版),现在我已经了解到他教我们如何使用直接声音。 The book uses it's own DirectSound.h and DirectSound.cpp files, which were from a previous release of the DirectX SDK, but when I try to compile I get the "LNK2019: unresolved external symbol" error. 这本书使用了自己的DirectSound.h和DirectSound.cpp文件,它们来自DirectX SDK的早期版本,但是当我尝试编译时,出现“ LNK2019:无法解析的外部符号”错误。

1>DirectSound.obj : error LNK2019: unresolved external symbol _DXTraceA@20 referenced in function "public: long thiscall CSoundManager::Initialize(struct HWND *,unsigned long)" (?Initialize@CSoundManager@@QAEJPAUHWND__@@K@Z) 1> DirectSound.obj:错误LNK2019:在函数“ public:long thiscall CSoundManager :: Initialize(struct HWND *,unsigned long)”中引用的未解析的外部符号_DXTraceA @ 20(?Initialize @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)

1>DirectSound.obj : error LNK2019: unresolved external symbol _DirectSoundCreate8@12 referenced in function "public: long thiscall CSoundManager::Initialize(struct HWND *,unsigned long)" (?Initialize@CSoundManager@@QAEJPAUHWND__@@K@Z) 1> DirectSound.obj:错误LNK2019:在函数“ public:long thiscall CSoundManager :: Initialize(struct HWND *,unsigned long)”中引用了未解析的外部符号_DirectSoundCreate8 @ 12(?Initialize @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)

I have not implemented any Direct Sound code in my project as yet, the mere presence of these files causes the project to not compile. 到目前为止,我尚未在项目中实现任何直接声音代码,这些文件的存在会导致项目无法编译。 Without them, the project compiles and runs perfectly. 没有它们,该项目将编译并完美运行。

#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;
}

Error LNK2019 is about adding a missing library - a typical problem. 错误LNK2019与添加缺少的库有关-这是一个典型的问题。 You should identify missing symbols, then identify library to additionally link, then add it using #pragma or via project settings. 您应该确定丢失的符号,然后确定要附加链接的库,然后使用#pragma或通过项目设置将其添加。

Also as it's a beginner question, most likely Stack Overflow already has something closely related. 同样,这是一个初学者的问题,很可能Stack Overflow已经有一些密切相关的东西。 Be always sure to run a search for it, compare code snippets to yours. 始终确保对其进行搜索,将代码段与您的代码段进行比较。

Related questions show that you need dsound.lib and dxerr.lib to be linked in. 相关问题表明,您需要链接dsound.lib和dxerr.lib。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM