RFSVieira Posted October 22, 2022 at 11:39 PM Report Share #627696 Posted October 22, 2022 at 11:39 PM Boa noite, Estou usando Visual Studio 2019 e estou com varios problemas.. Estou fazendo um teste de bibliotecas giflib com addon https://github.com/grimfang4/SDL_gifwrap, para SDL2. para correr gifs animados em SDL2. usando o exemplo base do gifwrap o programa corre e compila, mas tendo logo a partida 2 problemas, tenho que usar main.c (C, quando quero usar cpp) e include tem que ser #include "SDL_gifwrap/SDL_gifwrap.c", onde deveria ser .h, mas se colocar .h o programa simplesmente nao compila. O erro aqui apresentado com .h é o mesmo de quando tento compilar com main.cpp. LNK2019. main.c/cpp neste caso so roda se for c. //BEGIN PROGRAM HEAD //BEGIN INCLUDES //local headers //#include "helper.h" #include <gif_lib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "SDL_gifwrap/SDL_gifwrap.h" //should be SDL_gifwrap.c #include "sdl.h" #include <SDL_image.h> //END INCLUDES //BEGIN GLOBALS SDL_Window* Window; SDL_Renderer* Renderer; //SDL_Window* Window = NULL; //SDL_Renderer* Renderer = NULL; SDL_Texture* texture_; SDL_Rect gif; GIF_Image* gifA = NULL; Uint16 i = 0; int br; int bg; int bb; int logging = 0; //END GLOBALS //BEGIN FUNCTION PROTOTYPES void draw_current_gif_frame(void); //END FUNCTION PROTOTYPES //BEGIN MAIN FUNCTION int main(int argc, char* argv[]) { (void)argc; (void)argv; SDL_Init(SDL_INIT_EVERYTHING); //TTF_Init(); Window = SDL_CreateWindow("SDL2 gif stress", 50, 50, 350, 350, 0); //Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(Renderer, 255, 0, 0, 255); SDL_RenderClear(Renderer); //BEGIN GIF int error; // GifFileType * gif2 = DGifOpenFileName("c-exec.gif", &error); char gifname[50]; if (argc < 2) sprintf(gifname, "33.gif"); else sprintf(gifname, argv[1]); GifFileType* gif2 = DGifOpenFileName(gifname, &error); if (DGifSlurp(gif2) == GIF_ERROR) { DGifCloseFile(gif2, &error); } // // SDL_Log("%d",gif2->SColorMap->Colors->Red); br = gif2->SColorMap->Colors->Red; // SDL_Log("%d",gif2->SColorMap->Colors->Green); bg = gif2->SColorMap->Colors->Green; // SDL_Log("%d",gif2->SColorMap->Colors->Blue); bb = gif2->SColorMap->Colors->Blue; if (gifA = GIF_LoadImage(gifname)) i = 0; SDL_Event event; int running = 1; int pause = 0; //BEGIN TIMING int delay; unsigned int startTime, currentTime, frameTime = 0; startTime = SDL_GetTicks(); delay = gifA->frames[i]->delay; //END TIMING //END INIT //BEGIN MAIN LOOP while (running) { //BEGIN EVENT LOOP while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { running = 0; } else { SDL_SetWindowTitle(Window, "SDL 2 - Animated GIF"); } } //END EVENT LOOP currentTime = SDL_GetTicks(); frameTime = currentTime - startTime; startTime = currentTime; if (delay <= 0) { i++; if (i > gifA->num_frames - 1) i = 0; delay = gifA->frames[i]->delay; } delay -= frameTime; /*}*/ //BEGIN RENDERING draw_current_gif_frame(); //END RENDERING SDL_Delay(33); } //END MAIN LOOP //BEGIN CLEAN UP if (texture_ != NULL) SDL_DestroyTexture(texture_); if (gifA != NULL) GIF_FreeImage(gifA); SDL_DestroyRenderer(Renderer); SDL_DestroyWindow(Window); //TTF_Quit(); SDL_Quit(); //exit_(); //END CLEAN UP return EXIT_SUCCESS; } //END MAIN FUNCTION void draw_current_gif_frame() { gif.x = (gifA->frames[i]->left_offset);// *current_scale) + gif_canvas.dst.x; gif.y = (gifA->frames[i]->top_offset);// * current_scale) + gif_canvas.dst.y; gif.w = (gifA->frames[i]->width);// * current_scale); gif.h = (gifA->frames[i]->height);// * current_scale); // SDL_SetRenderDrawColor(Renderer, br, bg, bb, 255); SDL_RenderFillRect(Renderer, &gif); //SDL_RenderClear(Renderer); texture_ = SDL_CreateTextureFromSurface(Renderer, gifA->frames[i]->surface); SDL_RenderCopy(Renderer, texture_, NULL, &gif); SDL_RenderPresent(Renderer); } agradeco a ajuda, pois estou mentalmente bloqueado, possivelmente por algo simples. P.S ja cheguei a add extern"C" no include mas tambem não ajudou. Obrigado Link to comment Share on other sites More sharing options...
thoga31 Posted October 24, 2022 at 07:31 PM Report Share #627720 Posted October 24, 2022 at 07:31 PM Pode haver várias causas, mas uma vez que são bibliotecas feitas por ti, vou colocar de parte a possibilidade de estares a linkar para arquitecturas diferentes. Verifica algumas coisas, nomeadamente: Qual a ordem pela qual estás a fazer os includes; Se cada ficheiro .h está envolto com as seguintes instruções para o pré-processador: #ifndef NOME_DA_BIBLIOTECA_H #define NOME_DA_BIBLIOTECA_H // Biblioteca aqui #endif Se o linker está a procurar devidamente o ficheiro .c correspondente ao header file .h. Para uma ajuda mais adequada, necessitaremos de saber exactamente o que o Visual Studio está a dizer e possivelmente ver pelo menos excertos dos header files em causa. Cumprimentos. 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
RFSVieira Posted October 28, 2022 at 12:38 PM Author Report Share #627830 Posted October 28, 2022 at 12:38 PM Obrigado pelo tempo e resposta thoga31, a biblioteca SDL_gifwrap e a giflib não sao minhas, o unico ficheiro que criei foi o main.c ou main.cpp. SDL2 é uma biblioteca de interface simples para gráficos, som, e dispositivos de entrada, mas não suporta gif´s animados, a unica forma que encontrei de add o suporte foi através do giflib + SDL_gifwrap, Estive a ver o code do SDL_gifwrap e já tem as instrucoes tanto para Header como para c++, se tiver tempo consegue consultar atraves do git link da 1 mensagem. #ifndef SDL_GIFWRAP_H #define SDL_GIFWRAP_H #ifdef __cplusplus extern "C" { #endif Estranhamente tem esse problema se incluir o header numa main.c ele não roda so roda se incluir o das funcoes .c e penso que o problema estará por ai, pois quando tento usar em cpp é no mesmo ponto que ele da erro, so que no caso do cpp se o include for .c ele diz a linha do erro, pelo que percebo dá erro em qualquer funco que eu tente usar. Adiciono um link com prints do VS2019 Desde já agradecido pela resposta, em 10 foruns foi a unica resposta. https://meocloud.pt/link/d7fa7dce-c3cf-4977-819e-25756a96f7e9/CPP SDL/ Link to comment Share on other sites More sharing options...
thoga31 Posted October 31, 2022 at 07:07 PM Report Share #627907 Posted October 31, 2022 at 07:07 PM Olá @RFSVieira. Desculpa só responder agora. Tive problemas em aceder ao fórum este fim-de-semana e só agora pude voltar aqui. Confesso que não costumo trabalhar com o Visual Studio uma vez que toda a minha programação em C++ é feita em Linux. Contudo, do que me lembro, talvez tenhas de verificar nas definições do projecto quais são as dependências indicadas (bibliotecas *.lib e afins), assim como os caminhos de pesquisa dos includes. Tem igualmente em atenção a localização dos ficheiros .c e .h: em princípio devem estar em pastas separadas, e não na mesma pasta. Se estiverem na mesma pasta, poderá acontecer precisamente um problema de linkagem: o linker vê o ficheiro .h no local esperado (pasta de includes), mas não encontra o .c na pasta de código. Mas se incluíres directamente o .c que está junto do .h, então esse problema, em princípio, é "ultrapassado". Quanto à conversão de bool para SDL_bool, creio que um static_cast possa resolver o problema (não tenho a certeza absoluta, e infelizmente agora não tenho tempo de confirmar, mas a ideia é fazer type casting, sendo que em C++ há várias formas de o fazer). Cumprimentos. Knowledge is free! Link to comment Share on other sites More sharing options...
RFSVieira Posted October 31, 2022 at 07:28 PM Author Report Share #627911 Posted October 31, 2022 at 07:28 PM Obrigado pela ajuda, infelizmente não devo testar para poder dar feedback, porque o Sdl2 actualizou com opção de animação, deixando de ser. Necessário uma biblioteca externa, descobri só ontem, tenho reparado que é uma actualização prematura pois tirando a função não tem mais info acerca de... , nem no starksflow conseguiram ajudar, além de me colarem a função estao como eu, em branco hehe, 😅, estou a tentar actualizar uma frontend para retrogames, tenho um longo caminho pela frente, visto ter estado afastado da programação por quase 15 anos. A frontend funciona com as bibliotecas de SDL2 e gstreamer, foi desenvolvida em C++, hoje tentarei actualizar as bibliotecas de SDL2 e seus dlls, para testar se não existe incompatibilidades no código actual. Se tudo correr bem, acho que terei que descobrir como actualizar a nova opção de leitura de ficheiros animados, visto a função ser diferente da actual que o programa usa para abrir imagens e vídeos, o maior problema é que o actual Dev, apagou todos comentários, e praticamente abandonou o desenvolvimento e actualização, já converti todo sistema de compilação para VS2019, pois a mesma estava a ser dev em Linux, e o mesmo não reporta os mesmos bugs que o win reporta, e possivelmente 95 a 99% da comunidade utiliza Windows, a frontend tem tb opção para Raspberry pi. Mais uma vez obrigado Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now