2016-12-17 3 views
1

Итак, я читаю «Начальное программирование игры третьего издания» Джонатана С. Харбора, и я дошел до того, что он учит нас, как использовать 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; 
} 
+0

'1' вы должны включать в себя полное сообщение об ошибке' 2 'add' #pragma comment (lib, "dsound.lib"); 'строка выглядит следующим образом: http://stackoverflow.com/questions/15543918/application-works-in-visual-studio-but-release-debug-exe -does-not –

+0

Я забыл добавить это. Он был изменен, чтобы перечислить ошибку. –

+0

Добавление .lib (см. Выше) устраняет вторую ошибку. Для первого, см. Http://stackoverflow.com/questions/9392252/which-header-should-i-include-for-dxtrace –

ответ

2

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

Также, как вопрос новичков, скорее всего, Stack Overflow уже имеет что-то тесно связанное. Будьте всегда уверены, что запустите поиск, сравните фрагменты кода с вашими.

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