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:
- Veränderung der Unterschrift des Haupt-Funktion zu
int main(int argc, char** argv)
- Link-
liballegro_main.dylib
Danke, das hat funktioniert! Warum macht es einen Unterschied? Ändert sich der Kompilierungsprozess für verschiedene Dateierweiterungen? – sdgfsdh
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