2016-06-04 21 views
0

Ich versuche ein minimales Beispiel von Allegro unter OSX zu bekommen.Hauptfunktion nicht gefunden, wenn Allegro 5 unter OSX läuft

Ich installierte die stabile Version Allegro 5.2 mit Homebrew, as specified in the Allegro wiki.

Hier ist mein Code (allegro.hpp):

/* 
* This program uses the Allegro game library to display a blank window. 
* 
* It initializes the display and starts up the main game loop. The 
* game loop only checks for two events: timer (determined by the FPS) 
* and display close (when the user tries to close the window). 
* 
* http://www.damienradtke.org/building-a-mario-clone-with-allegro 
*/ 

#include <stdio.h> 
#include <allegro5/allegro.h> 

constexpr float FPS = 60.0f; 

int main(int argc, char** argv) { 
    ALLEGRO_DISPLAY *display = NULL; 
    ALLEGRO_EVENT_QUEUE *event_queue = NULL; 
    ALLEGRO_TIMER *timer = NULL; 

    bool running = true; 
    bool redraw = true; 

    // Initialize allegro 
    if (!al_init()) { 
    fprintf(stderr, "Failed to initialize allegro.\n"); 
    return 1; 
    } 

    // Initialize the timer 
    timer = al_create_timer(1.0f/FPS); 
    if (!timer) { 
    fprintf(stderr, "Failed to create timer.\n"); 
    return 1; 
    } 

    // Create the display 
    display = al_create_display(640, 480); 
    if (!display) { 
    fprintf(stderr, "Failed to create display.\n"); 
    return 1; 
    } 

    // Create the event queue 
    event_queue = al_create_event_queue(); 
    if (!event_queue) { 
    fprintf(stderr, "Failed to create event queue."); 
    return 1; 
    } 

    // Register event sources 
    al_register_event_source(event_queue, al_get_display_event_source(display)); 
    al_register_event_source(event_queue, al_get_timer_event_source(timer)); 

    // Display a blank screen 
    al_clear_to_color(al_map_rgb(100, 149, 237)); 
    al_flip_display(); 

    // Start the timer 
    al_start_timer(timer); 

    // Game loop 
    while (running) { 
    ALLEGRO_EVENT event; 
    ALLEGRO_TIMEOUT timeout; 

    // Initialize timeout 
    al_init_timeout(&timeout, 0.06); 

    // Fetch the event (if one exists) 
    bool get_event = al_wait_for_event_until(event_queue, &event, &timeout); 

    // Handle the event 
    if (get_event) { 
     switch (event.type) { 
     case ALLEGRO_EVENT_TIMER: 
      redraw = true; 
      break; 
     case ALLEGRO_EVENT_DISPLAY_CLOSE: 
      running = false; 
      break; 
     default: 
      fprintf(stderr, "Unsupported event received: %d\n", event.type); 
      break; 
     } 
    } 

    // Check if we need to redraw 
    if (redraw && al_is_event_queue_empty(event_queue)) { 
     // Redraw 
     al_clear_to_color(al_map_rgb(100, 149, 237)); 
     al_flip_display(); 
     redraw = false; 
    } 
    } 

    // Clean up 
    al_destroy_display(display); 
    al_destroy_event_queue(event_queue); 

    return 0; 
} 

Hier mein Build ist und Befehl ausführen:

$ clang++ -I/usr/local/include/ -L/usr/local/lib -lallegro -lallegro_main allegro.hpp -std=c++14 && ./a.out 

Und hier ist der Fehler, den ich empfangen:

dyld: Symbol not found: __al_mangled_main 
    Referenced from: /usr/local/opt/allegro/lib/liballegro_main.5.2.dylib 
    Expected in: flat namespace 
in /usr/local/opt/allegro/lib/liballegro_main.5.2.dylib 
Trace/BPT trap: 5 

I habe die an anderer Stelle angegebene Lösung bereits ausprobiert:

  1. Veränderung der Unterschrift des Haupt-Funktion zu int main(int argc, char** argv)
  2. Link-liballegro_main.dylib

Antwort

1

Sie nannten es allegro.hpp, auch wenn es sich um eine Quelldatei, kein Header-Datei.

Benennen Sie es in something.cpp oder something.cc um.

+0

Danke, das hat funktioniert! Warum macht es einen Unterschied? Ändert sich der Kompilierungsprozess für verschiedene Dateierweiterungen? – sdgfsdh

+1

Ja und Nein. Kompilierung ändert sich für verschiedene Dateitypen. Dateitypen werden normalerweise durch Dateierweiterungen bestimmt. Ich denke, Sie können 'clang' sagen, was eine Header-Datei ist und was eine Quelldatei ist, aber ich habe das noch nie getan und Sie sollten es auch nicht tun. Dafür sind Erweiterungen gedacht. Was Sie tun, wenn Sie eine Headerdatei kompilieren, erstellen Sie einen [vorkompilierten Header] (https://en.wikipedia.org/wiki/Precompiled_header), keine ausführbare Datei. Wenn Sie den '-o' Schalter nicht hinzufügen, sollten Sie normalerweise eine Datei wie' allegro.hpp.gch' oder 'allegro.pch' oder so ähnlich sehen. – hgiesel