Итак, я читаю «Начальное программирование игры третьего издания» Джонатана С. Харбора, и я дошел до того, что он учит нас, как использовать Direct Sound. В книге используются собственные файлы DirectSound.h и DirectSound.cpp, которые были из предыдущей версии DirectX SDK, но когда я пытаюсь скомпилировать, я получаю ошибку «LNK2019: неразрешенный внешний символ».ошибка LNK2019: неразрешенный внешний символ Direct Sound
1> DirectSound.obj: ошибка LNK2019: неразрешенный внешний символ _DXTraceA @ 20 ссылочного в функции? "Общественность: долго thiscall CSoundManager :: Initialize (структура HWND *, неподписанные долго)" (Инициализировать @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)
1> DirectSound.obj: ошибка LNK2019: неразрешенный внешний символ _DirectSoundCreate8 @ 12 ссылается на функцию «общественность: долго thiscall CSoundManager :: Initialize (структура HWND *, без знака long) " (? Инициализировать @ CSoundManager @@ QAEJPAUHWND __ @@ K @ Z)
Я еще не реализовал какой-либо код прямого звука в моем проекте, простое присутствие этих файлов заставляет проект не компилироваться. Без них проект компилируется и работает отлично.
#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' вы должны включать в себя полное сообщение об ошибке' 2 'add' #pragma comment (lib, "dsound.lib"); 'строка выглядит следующим образом: http://stackoverflow.com/questions/15543918/application-works-in-visual-studio-but-release-debug-exe -does-not –
Я забыл добавить это. Он был изменен, чтобы перечислить ошибку. –
Добавление .lib (см. Выше) устраняет вторую ошибку. Для первого, см. Http://stackoverflow.com/questions/9392252/which-header-should-i-include-for-dxtrace –