【问题标题】:Error while linking SFML. LNK2001链接 SFML 时出错。 LNK2001
【发布时间】:2014-03-25 09:30:20
【问题描述】:

我正在使用 SFML 创建一个项目。到目前为止一切正常。我创建了一个名为 BufferHelper.cpp 的类,然后出现了一个错误。

我正在与: 视觉工作室专业版 2013 SFML 2.1 视窗 8.1

我已经添加了所有的库

'sfml-lib.dll's for Release 和 'sfml-lib-d.dll's 用于调试

错误日志:

Error   1   error LNK2001: unresolved external symbol "public: class sf::SoundBuffer __thiscall BufferHelper::MergeBuffers(class sf::SoundBuffer,class sf::SoundBuffer)" (?MergeBuffers@BufferHelper@@QAE?AVSoundBuffer@sf@@V23@0@Z)    C:\Users\Krisjanis\documents\visual studio 2013\Projects\BD_Test\BD_Test\main.obj   BD_Test
Error   2   error LNK1120: 1 unresolved externals   C:\Users\Krisjanis\documents\visual studio 2013\Projects\BD_Test\Release\BD_Test.exe    BD_Test

Main.cpp

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include "BufferHelper.h"

int main()
{
    sf::SoundBufferRecorder recorder;
    sf::SoundBufferRecorder recorder2;

    sf::SoundBuffer buffer;
    sf::SoundBuffer buffer2;

    sf::Sound sound;
    sf::Sound sound2;

    int iTrackActive = 1;

    bool bTrack1Active = true;
    bool bTrack2Active = false;

    sf::RenderWindow window(sf::VideoMode(1200, 800), "Loopify!");
    //sf::RenderWindow window(sf::VideoMode(1200, 800), "Loopify!", sf::Style::Fullscreen);
    sf::Texture texture;
    texture.loadFromFile("images/a.png");

    BufferHelper a; 
    sf::SoundBuffer finalbuffer = a.MergeBuffers(buffer, buffer2);

    sf::Sprite sprite;
    sprite.setTexture(texture);

    bool recording = false;
    if (!sf::SoundBufferRecorder::isAvailable())
    {
        std::cout << "Recorder not available";
    }
    else
    {
        std::cout << "GO AHEAD AND RECORD";
    }

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
            if (event.type == sf::Event::KeyPressed)
            {
                if (event.key.code == sf::Keyboard::Space && !recording)
                {
                    recording = true;
                    recorder.start();

                }
                else if (event.key.code == sf::Keyboard::Space && recording)
                {
                    recorder.stop();
                    recording = false;
                    if (iTrackActive == 1)
                    {
                        buffer = recorder.getBuffer();
                        sound.setBuffer(buffer);
                        sound.setLoop(true);
                        sound.play();
                    }
                    if (iTrackActive == 2)
                    {
                        buffer2 = recorder.getBuffer();
                        sound2.setBuffer(buffer);
                        sound2.setLoop(true);
                        sound2.play();
                    }
                }
                else if (event.key.code == sf::Keyboard::Num1)
                {
                    iTrackActive = 1;
                }
                else if (event.key.code == sf::Keyboard::Num2)
                {
                    iTrackActive = 2;
                }
            }
        }
        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}

BufferHelper.cpp

    #include <SFML/System.hpp>
#include <SFML/Audio.hpp>
#include "BufferHelper.h"
#include <iostream>
#include <vector>


BufferHelper::BufferHelper()
{

}

sf::SoundBuffer MergeBuffers(sf::SoundBuffer BufferOne, sf::SoundBuffer BufferTwo)
{

    int iLength;
    int iShortLength;
    const sf::Int16* LongerSamples;
    const sf::Int16* ShorterSamples;

    if (BufferOne.getSampleCount() > BufferTwo.getSampleCount())
    {
        LongerSamples = BufferOne.getSamples();
        ShorterSamples = BufferTwo.getSamples();
        iLength = BufferOne.getSampleCount();
        iShortLength = BufferTwo.getSampleCount();
    }
    else
    {

        LongerSamples = BufferTwo.getSamples();
        ShorterSamples = BufferOne.getSamples();
        iLength = BufferTwo.getSampleCount();
        iShortLength = BufferOne.getSampleCount();
    }

    std::vector<sf::Int16> FinalSamplesVector;
    FinalSamplesVector.reserve(iLength);

    for (int i = 0; i < iLength; i++)
    {
        if (i < iShortLength)
        {
            double dSampleOne = (LongerSamples[i] + 32768.) / 65535.;
            double dSampleTwo = (ShorterSamples[i] + 32768.) / 65535.;
            double dResult = 0;

            if (dSampleOne < 0.5 && dSampleTwo < 0.5)
            {
                dResult = 2 * dSampleOne * dSampleTwo;
            }
            else
            {
                dResult = 2 * (dSampleOne + dSampleTwo) - 2 * dSampleOne * dSampleTwo - 1;
            }

            FinalSamplesVector.push_back(static_cast<sf::Int16>(dResult * 65535. - 32768.));
        }
        else
        {
            FinalSamplesVector.push_back(LongerSamples[i]);
        }
    }

    sf::SoundBuffer FinalBuffer;
    FinalBuffer.loadFromSamples(&FinalSamplesVector[0], FinalSamplesVector.size(), 2, 44100);

    return FinalBuffer;
}

BufferHelper::~BufferHelper()
{
}

BufferHelper.h

#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
using namespace sf;
class BufferHelper
{
public:
    BufferHelper();

    sf::SoundBuffer MergeBuffers(sf::SoundBuffer, sf::SoundBuffer);

    ~BufferHelper();
};

如果收到任何形式的反馈,我将不胜感激。

【问题讨论】:

    标签: c++ linker visual-studio-2013 linker-errors sfml


    【解决方案1】:

    您没有声明函数 MergeBuffers() 的主体。 这个跟SFML没关系,加个

    sf::SoundBuffer BufferHelper::MergeBuffers(sf::SoundBuffer, sf::SoundBuffer)
    {
    // some code
    }
    

    在您的 cpp 文件中。

    编辑:我意识到您错误地重新复制了您的 main.cpp 文件代码。请展示 BufferHelper.cpp 的好代码

    【讨论】:

    • 谢谢你,你是对的,我错误地复制了错误的代码。但是你的一小段代码向我展示了做事的正确方法......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    相关资源
    最近更新 更多