Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dev-C++ - błąd linkera ( [Linker error] main.o:main.cpp:(.text+0x1d6): undefined reference to `midiInGetNumDevs@0'

Ostatnio zmodyfikowano 2019-05-04 00:26
Autor Wiadomość
johnc
Temat założony przez niniejszego użytkownika
Dev-C++ - błąd linkera ( [Linker error] main.o:main.cpp:(.text+0x1d6): undefined reference to `midiInGetNumDevs@0'
» 2019-05-03 19:28:52
W moim programie WINAPI postanowiłem użyć funkcje obsługi MIDI. Dla przykładu:
C/C++
int mn = midiInGetNumDevs();
Jeżeli program kompiluję jako plik c++, to nie otrzymuję żadnych błędów i program działa.
Jeżeli go kompiluję jako projekt, to linker wywala:

   [Linker error] main.o:main.cpp:(.text+0x1d6): undefined reference to `midiInGetNumDevs@0'

Zachowuje się jakby mu brakowało ciała funkcji, ale przecież ja nie tworzę tego ciała tylko korzystam z "dobrodziejstwa" Microsoftu.
Być może trzeba w w pliku *.rc jakoś zdeklarować te funkcje, ale nie wiem jak.

Proszę o pomoc, bo trochę przeryłem internet, ale rozwiązania nie znalazłem.
P-174564
nanoant20
» 2019-05-03 20:04:18
za mało udostępniasz, zgaduję trzeba dodać winmm.lib
#pragma comment(lib, "winmm.lib")


Umieszcza rekord komentarza do obiektu pliku lub pliku wykonywalnego
midiInGetNumDevs function

P-174566
johnc
Temat założony przez niniejszego użytkownika
» 2019-05-03 23:30:25
Mój program jest już strasznie kobylasty, więc żeby skupić się tylko na opisywanym problemie wygenerowałem w DEVie nowy projekt, który zawiera podstawy do tworzenia okna
i po funkcji "CreateWindowEx" dopisałem odwołanie do funkcji MIDI "midiInGetNumDevs()".
Jak otwieram i kompiluję plik jako plik źródłowy, to wszystko jest OK, natomiast jeżeli tą samą treść umieszczę w projekcie DEV to mi się pluje o tą funkcję.
C/C++
#include <windows.h>

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam ) {
    switch( Message ) {
       
        /* Upon destruction, tell the main thread to stop */
    case WM_DESTROY: {
            PostQuitMessage( 0 );
            break;
        }
       
        /* All other messages (a lot of them) are processed using default procedures */
        default:
        return DefWindowProc( hwnd, Message, wParam, lParam );
    }
    return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
    WNDCLASSEX wc; /* A properties struct of our window */
    HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
    MSG msg; /* A temporary location for all messages */
   
    /* zero out the struct and set the stuff we want to modify */
    memset( & wc, 0, sizeof( wc ) );
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
   
    /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszClassName = "WindowClass";
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); /* Load a standard icon */
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); /* use the name "A" to use the project icon */
   
    if( !RegisterClassEx( & wc ) ) {
        MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
        return 0;
    }
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass", "Caption", WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, /* x */
    CW_USEDEFAULT, /* y */
    640, /* width */
    480, /* height */
    NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL ) {
        MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
        return 0;
    }
   
    int mn = midiInGetNumDevs();
   
    /*
    This is the heart of our program where all input is processed and
    sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
    this loop will not produce unreasonably high CPU usage
    */
    while( GetMessage( & msg, NULL, 0, 0 ) > 0 ) { /* If no error is received... */
        TranslateMessage( & msg ); /* Translate key codes to chars if present */
        DispatchMessage( & msg ); /* Send it to WndProc */
    }
    return msg.wParam;
}
P-174568
pekfos
» 2019-05-03 23:48:54
Musisz dodać bibliotekę winmm do linkera. Dodaj opcję linkera -lwinmm.
P-174569
nanoant20
» 2019-05-03 23:49:46
zobacz #include biblioteki githab
P-174570
johnc
Temat założony przez niniejszego użytkownika
» 2019-05-04 00:26:09
No pekfos - naprawdę ekspert. Szacun.
Jedyne co było potrzebne to właśnie "-lwinmm" w linkerze. Ja to miałem, ale w kompilatorze.

Bardzo dziękuję!
P-174571
« 1 »
  Strona 1 z 1