Включите файл .h не работает в Android Studio в программировании на C (с использованием SDL2) - PullRequest
0 голосов
/ 09 мая 2019

Я на самом деле разрабатываю приложение C на Android Studio, используя SDL 2, графическую библиотеку C. Но проблема не в самой библиотеке, а в #include моих собственных файлов.

Я создал исходные файлы, в которые я поместил свои функции, я связал с ними заголовочные файлы с объявлениями функций. Но когда я вызываю функции из моего основного исходного файла, я получаю сообщение об ошибке: error: undefined reference to 'draw_render_rectangle' например. Это не работает ни для одного из моих файлов или функций. Но это работает для SDL.

Итак, я пытаюсь #include. Основной исходный файл "main_graphics.c":

#include "main_graphics.h"
void disp_main_menu(int selected) {
    POINT A, B;
    A.x = 0;
    A.y = 0;
    B.x = WIDTH;
    B.y = HEIGHT;
    draw_render_rectangle(A, B, 70, 70, 70);
}

Основной заголовочный файл "main_graphics.h":

#ifndef ANDROID_GAME_MAIN_GRAPHICS_H
#define ANDROID_GAME_MAIN_GRAPHICS_H


#include "../SDL2/include/SDL.h"
#include "../SDL2/include/SDL.h"
#include "../SDL2_ttf/SDL_ttf.h"
#include "../SDL2_image/SDL_image.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "graphics_mobile.h"
int WIDTH = 1080;
int HEIGHT = 1920;

void disp_main_menu(int selected);

#endif //ANDROID_GAME_MAIN_GRAPHICS_H

"graphics_mobile.c":

#include "graphics_mobile.h"

typedef struct point {int x,y;} POINT;

void draw_render_rectangle(POINT p1, POINT p2, Uint8 r, Uint8 g, Uint8 b)
{
    SDL_Rect rectangle;
    int xmin, xmax;
    int ymin, ymax;
    int i,j;

    if (p1.x < p2.x) {xmin=p1.x; xmax=p2.x;} else{xmin=p2.x; xmax=p1.x;}
    if (p1.y < p2.y) {ymin=p1.y; ymax=p2.y;} else{ymin=p2.y; ymax=p1.y;}

    rectangle.x = xmin;
    rectangle.y = HEIGHT - (ymax-ymin) - ymin;
    rectangle.w = xmax-xmin;
    rectangle.h = ymax-ymin;
    SDL_SetRenderTarget(renderer, texture);
    SDL_RenderDrawRect(renderer,&rectangle);
    SDL_SetRenderDrawColor(renderer, r, g, b, 0x00);
    SDL_RenderFillRect(renderer, &rectangle);
    SDL_SetRenderTarget(renderer, NULL);
    SDL_RenderCopy(renderer, texture, NULL, NULL);
}

"graphics_mobile.h"

#ifndef ANDROID_GAME_GRAPHICS_MOBILE_H
#define ANDROID_GAME_GRAPHICS_MOBILE_H
#include "main_graphics.h"

typedef struct point {int x,y;} POINT;

void draw_render_rectangle(POINT p1, POINT p2, Uint8 r, Uint8 g, Uint8 b);

#endif //ANDROID_GAME_GRAPHICS_MOBILE_H

Одна странность в том, что автозаполнение работает, когда я набираю функцию, она фактически распознает ее и сообщает мне в маленьком окне автозаполнения, что она определена в "graphics_mobile.h".

Может проблема в компиляторе? Я попытался ndk-bundle_10e и ndk-bundle_16b, и я получаю ту же ошибку.

1 Ответ

0 голосов
/ 09 мая 2019

Итак, я провел несколько тестов и получил рабочий код:

, который вы должны поместить в "graphics_mobile.h":

#ifndef ANDROID_GAME_GRAPHICS_MOBILE_H
#define ANDROID_GAME_GRAPHICS_MOBILE_H
#include "main_graphics.h"
#include "graphics_mobile.c"

#endif //ANDROID_GAME_GRAPHICS_MOBILE_H

и удалить объявления функций

...