Jump to content

Problemas na ligação de bliblioteca C com main.cpp


RFSVieira

Recommended Posts

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

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.

  • Thanks 1

Knowledge is free!

Link to comment
Share on other sites

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.