0
votes

I've been getting these LNK2019s for a little while now and can't seem to find a way to get rid of them. I'm aware that there are a lot of threads on these errors already, but I've yet to find anything that's helped me so hoped someone might miss something glaringly obvious I may have missed.

I've not learnt very traditionally, so sorry if my code's a bit messy.

main:

#include "eventLoop.h"
#include <time.h>
#include <iostream>

using namespace std;

bool buttonA, buttonB, buttonC, buttonD, buttonE, buttonF, buttonG = false;
bool KeepProgramOpen = true;
time_t timer;
time_t oldtime;
time_t dtime;
time_t looptime;
int rate;
char Note;
bool FirstLoop = true;

eventLoop MainEventLoop;

int main()
{
    rate = 60;
    looptime = 1000 / rate;

    while(KeepProgramOpen==true)
    {

        time(&timer);
        dtime = timer-oldtime;

        if(dtime<looptime)
        {
            continue;
        }

        oldtime = timer;

        MainEventLoop.FindFinalNote(buttonA, buttonB, buttonC, buttonD, buttonE, buttonF, buttonG, FirstLoop);

        FirstLoop = false;

    //Closing stuff goes here
    }
}

eventLoop.h:

#pragma once

class eventLoop {

public:

    void FindFinalNote(bool, bool, bool, bool, bool, bool, bool, bool);

protected:

};

eventLoop.cpp:

#include "eventLoop.h"
#include "MidiOutput.h"
#include "FileIO.h"

MidiOutput MidiOutputX;

FileIO fileioX;

void eventLoop::FindFinalNote(bool A, bool B, bool C, bool D, bool E, bool F, bool G, bool firstloop)
{

    if(firstloop == true)
    {
        for (int loopindex=0; loopindex<10; loopindex++)
        {
        //  Note[loopindex] = Filecheck for notes
        }

        MidiOutputX.FindDevice(
            1,   /*int argc number of ports*/
            60,  /*char argv argument vector - strings pointed to, i don't really get it*/
        );
    }

    char Note[10];
    int KeyIndex = 0;
    FileIO::key CurrentKey;

    CurrentKey = fileioX.RetrieveKey(KeyIndex);

    for (int x = 0; x < 10; x++)
    {
        Note[x] = CurrentKey.Note[x];
    }

    //  There's a bunch of simple if statements here, nothing I need to bore you with
}

MidiOutput.h:

#pragma once

class MidiOutput {

public:

void FindDevice(int, char);
void PlayNote(unsigned char);
void EndNote();
void CloseDevice();

protected:

};

MidiOutput.cpp:

#include "MidiOutput.h"
#include <Windows.h>
#include <mmsystem.h>
#include <stdio.h>

union { unsigned long word; unsigned char data[4]; } message;
int midiport;
HMIDIOUT device;

void FindDevice(int argc, char** argv)
{

    if (argc < 2) {
        midiport = 0;
    } else {
        midiport = atoi(argv[1]);
    }
    printf("Midi output port set to %d.\n", midiport);

    midiOutOpen(&device, midiport, 0, 0, CALLBACK_NULL);

    message.data[0] = 0x90; //command byte
    message.data[1] = 60; //middle C 
    message.data[2] = 0; //volume, 0-100
    message.data[3] = 0; //not used
}

void MidiOutput::PlayNote(unsigned char Note)
{
    message.data[1] = Note;
    message.data[2] = 100;
}

void MidiOutput::EndNote()
{
    message.data[2] = 0;
}

void MidiOutput::CloseDevice()
{
    midiOutReset(device);
    midiOutClose(device);
}

Exact Errors:

Error 1 error LNK2019: unresolved external symbol "public: void __thiscall MidiOutput::FindDevice(int,char)" (?FindDevice@MidiOutput@@QAEXHD@Z) referenced in function "public: void __thiscall eventLoop::FindFinalNote(bool,bool,bool,bool,bool,bool,bool,bool)" (?FindFinalNote@eventLoop@@QAEX_N0000000@Z) C:\Users\Hilly\documents\visual studio 2010\Projects\GHX\GHX\eventLoop.obj GHX

Error 2 error LNK2019: unresolved external symbol _imp_midiOutOpen@20 referenced in function "void __cdecl FindDevice(int,char * *)" (?FindDevice@@YAXHPAPAD@Z) C:\Users\Hilly\documents\visual studio 2010\Projects\GHX\GHX\MidiOutput.obj GHX

Error 3 error LNK2019: unresolved external symbol _imp_midiOutClose@4 referenced in function "public: void __thiscall MidiOutput::CloseDevice(void)" (?CloseDevice@MidiOutput@@QAEXXZ) C:\Users\Hilly\documents\visual studio 2010\Projects\GHX\GHX\MidiOutput.obj GHX

Error 4 error LNK2019: unresolved external symbol _imp_midiOutReset@4 referenced in function "public: void __thiscall MidiOutput::CloseDevice(void)" (?CloseDevice@MidiOutput@@QAEXXZ) C:\Users\Hilly\documents\visual studio 2010\Projects\GHX\GHX\MidiOutput.obj GHX

Error 5 error LNK1120: 4 unresolved externals C:\Users\Hilly\documents\visual studio 2010\Projects\GHX\Debug\GHX.exe GHX

Thanks in advance, and sorry about the wall of code, I'm not sure what's necessary.

1

1 Answers

0
votes

The missing symbols, midiOutOpen, midiOutClose etc. are defined in the DLL Winmm.dll. You will need to link to Winmm.lib by either specifying it as an input to the link command or by including this in your file:

#pragma comment(lib, "Winmm.lib")

You're also getting an error about MidiOutput::FindDevice. You will need to fix up the signatures so that the .h file and .cpp match, and qualify the function definition in the .cpp file with the class name (MidiOutput::).