Как включить библиотеки SDL_gfx в проект Clion? - PullRequest
1 голос
/ 23 октября 2019

Итак, я столкнулся со странной вещью: я могу заставить библиотеки SDL2 работать в clion, но если я включу библиотеки SDL_gfx, он не скомпилируется.

Итак, вот что я 'мы сделали до сих пор:

  1. Я скачал версию SDL для Windows 64 с веб-сайта, распаковал ее и перетащил файлы в соответствующую папку MinGW.
  2. Я отредактировал файл cmake, чтобы clion мог его видеть, и он действительно работает

    Мой файл cmake:

    cmake_minimum_required(VERSION 3.15)
    project(pontok C)
    
    
    set(CMAKE_C_STANDARD 99)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
    
    find_package(SDL2 REQUIRED)
    
    add_executable(pontok main.c)
    
    include_directories(${SDL2_INCLUDE_DIR}
            ${SDL2_IMAGE_INCLUDE_DIR}
            ${SDL2_MIXER_INCLUDE_DIR}
            )
    
    target_link_libraries(pontok ${SDL2_LIBRARY}
            ${SDL2_IMAGE_LIBRARY}
            ${SDL2_MIXER_LIBRARY}
            )
    
  3. Я скачалПакет SDL_gfx от здесь и поместите файлы .h и .a в соответствующие папки MinGW. Клион может видеть это, и это кажется нормальным, пока я не нажму на компиляцию:

    Here you can see, that it is not highlighted, and it does nit have a problem with it.

Если мой код:

#include <stdio.h>
#include <math.h>
#include <SDL2\SDL2_gfxPrimitives.h>
#include <SDL2\SDL.h>

const int SCREEN_WIDH = 640;
const int SCREEN_HEIGHT = 480;

int main(int argc, char *argv[]) {
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
        SDL_Log("Nem indithato az SDL: %s", SDL_GetError());
        exit(1);
    }
    SDL_Window *window = SDL_CreateWindow("SDL peldaprogram", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 440, 360, 0);
    if (window == NULL) {
        SDL_Log("Nem hozhato letre az ablak: %s", SDL_GetError());
        exit(1);
    }
    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
    if (renderer == NULL) {
        SDL_Log("Nem hozhato letre a megjelenito: %s", SDL_GetError());
        exit(1);
    }
    SDL_RenderClear(renderer);

    int x, y, r;

    //circleRGBA(renderer, x, y, r, 255, 0, 0, 255);
    //circleRGBA(renderer, x + r, y, r, 0, 255, 0, 255);
    //circleRGBA(renderer, x + r * cos(3.1415 / 3), y - r * sin(3.1415 / 3), r, 0, 0, 255, 255);

    SDL_RenderPresent(renderer);

    SDL_Event ev;
    while (SDL_WaitEvent(&ev) && ev.type != SDL_QUIT) {
    }

    SDL_Quit();
    return 0;
}

чем это работает. Компилируется и появляется пустое окно. Но если я уберу эти три строки из комментариев, то он не скомпилируется, и я получу следующую ошибку:

CMakeFiles\pontok.dir/objects.a(main.c.obj): In function `SDL_main':
C:/Prog/pontok/main.c:28: undefined reference to `circleRGBA'
C:/Prog/pontok/main.c:29: undefined reference to `circleRGBA'
C:/Prog/pontok/main.c:30: undefined reference to `circleRGBA'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [CMakeFiles\pontok.dir\build.make:88: pontok.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:75: CMakeFiles/pontok.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/pontok.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:117: pontok] Error 2

Странно то, что clion может видеть эти объединения circleRGBA, в thisкартинка мы видим, что она может распознавать функцию, она записывает атрибуты рядом с переменными.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

К сожалению, SDL_gfx не имеет стандартного модуля cmake. Но вы можете найти его в интернете, набрав номер 1001 *. Поместите этот файл в каталог cmake/Modules.

find_package(SDL2_gfx REQUIRED)

Затем используйте ${SDL2_GFX_LIBRARIES} для ссылки

0 голосов
/ 27 октября 2019

Хорошо, так что я понял это. Проблема состояла в том, что clion не мог видеть файлы .c SDL2_gfx, поэтому мне пришлось добавить их в проект и отредактировать следующую строку в CMakeList.txt:

add_executable(pontok main.c SDL2_framerate.c SDL2_gfxPrimitives.c SDL2_imageFilter.c SDL2_rotozoom.c)

Таким образом, он скомпилирован и работает правильно.

...