2016-06-04 1 views
0

Я пытаюсь получить минимальный пример Allegro, работающего на OSX.Основная функция не найдена при запуске Allegro 5 на OSX

Я установил стабильную версию Allegro 5.2 с использованием Homebrew, as specified in the Allegro wiki.

Вот мой код (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; 
} 

Вот мой билд и выполнить команду:

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

А вот ошибка я получаю:

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 уже пробовали решение, данное в другом месте:

  1. Изменение подписи главного-функции для int main(int argc, char** argv)
  2. Link liballegro_main.dylib

ответ

1

Вы назвали его allegro.hpp, даже если это исходный файл, не заголовок файла а.

Переименуйте его в something.cpp или something.cc.

+0

Спасибо, что сработало! Почему это имеет значение? Изменяется ли процесс компиляции для разных расширений файлов? – sdgfsdh

+1

Да и нет. Изменения компиляции для разных типов файлов. Типы файлов обычно определяются расширениями файлов. Я думаю, вы можете сказать «clang», что такое заголовочный файл, и что такое исходный файл, но я никогда этого не делал, и вы тоже. Для этого нужны расширения. Что вы делаете, когда вы компилируете заголовочный файл, создается [предварительно скомпилированный заголовок] (https://en.wikipedia.org/wiki/Precompiled_header), а не исполняемый файл. Если вы не добавляете переключатель '-o', вы обычно должны видеть файл вроде' allegro.hpp.gch' или 'allegro.pch' или что-то вроде этого. – hgiesel

Смежные вопросы