основная функция не обнаруживается при компиляции - PullRequest
4 голосов
/ 10 мая 2019

Я пытаюсь запустить программу, которая открывает окно. цель состоит в том, чтобы запустить программу, открывая окно, правильно ли запускаются все программы?

Но когда я по какой-то причине запускаю свой код, я получаю эту ошибку:

Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Однако в моем коде у меня есть функция main(), так почему я получаю эту ошибку?

Это мой код:

#include <SDL2/SDL.h>
#include <SDL2_image/SDL_image.h>
#include <SDL2_ttf/SDL_ttf.h>
#include <stdio.h>

int main(){
    if(SDL_Init( SDL_INIT_EVERYTHING ) < 0){
        std::cout << "error 1\n";
        std::cout << SDL_GetError();
        std::cout << "\n";
        return -1;
        }
    if(TTF_Init() < 0){
        std::cout << "error 2\n";
        std::cout << TTF_GetError();
        std::cout << "\n";
        return -1;
    }
    SDL_Window* window = SDL_CreateWindow("test", 0, 0, 500, 500, 0);
    if(!window){
        std::cout << "error 3\n";
        std::cout << SDL_GetError();
        std::cout << "\n";
        return -1;
    }
    int windowid = SDL_GetWindowID(window);
    SDL_Renderer* Renderer = SDL_CreateRenderer(window, -1, 0);
    running = true;
    SDL_Event event;
    while(running){
        while(SDL_PollEvent(&event)){
            if(event.type == SDL_WindowEvent){
                if(event.window.windowID == windowid){
                    if(event.window.type == SDL_WindowClose){
                        Destroywindow(window);
                        running = false;
                    }
                }
            }
        }
    }
    return 0;
}

мой make-файл выглядит так:

#!/bin/bash

brew update
brew install sdl2
g++ -o /Users/mikahshattuck/noneproject/none2019-05-0909-22- 
14:2:/none.app/Contents/MacOS/mainrun.cpp -I /Library/Frameworks -l 
SDL2
exit 0

это полный выход:

Already up-to-date.
Warning: sdl2 2.0.9_1 is already installed and up-to-date
To reinstall 2.0.9_1, run `brew reinstall sdl2`
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Process completed]

Заранее спасибо

1 Ответ

4 голосов
/ 10 мая 2019

При использовании SDL в macOS или Windows вам необходимо добавить -Dmain=SDL_main к вашим флагам компиляции и -lSDL2main к вашим флагам ссылок. Поскольку вы используете Homebrew, вы можете сделать это проще и просто использовать pkg-config, чтобы получить правильные флаги. Используйте эту команду компилятора в качестве шаблона и адаптируйте ее под свои нужды:

g++ $(pkg-config --cflags sdl2) -I /Library/Frameworks source.cpp -o output_executable $(pkg-config --libs sdl2)

Однако, похоже, вы также используете SDL_ttf, а не просто SDL. В этом случае вам, вероятно, следует использовать SDL2_ttf вместо sdl2 в качестве аргумента пакета pkg-config:

g++ $(pkg-config --cflags SDL2_ttf) -I /Library/Frameworks source.cpp -o output_executable $(pkg-config --libs SDL2_ttf)

Пакет SDL2_ttf зависит от пакета sdl2, поэтому использование SDL2_ttf также выдаст необходимые флаги для sdl2.

Имена пакетов pkg-config соответствуют *.pc файлам, установленным Homebrew в /usr/local/lib/pkgconfig.

...