Jump to content
Dexter's Lab

C não linka a biblioteca em Linux

Recommended Posts

Dexter's Lab

Boas pessoal, estou com um problema mas não é a nível de código. E nisto peço especialmente a ajuda dos utilizadores mais experientes em C/C++ e em Linux.

É o seguinte, sou novo no Linux. Decidi mandar abaixo o Windows e utilizar só Linux. Aqui utilizo o compilador Code::Blocks.

Tenho vindo a programar sem problemas tanto C como C++. E ontem decidi começar a aprender a library SDL.

Mas acontece que, não sei porque razão, o meu compilador não reconhece as funções da biblioteca. Ele vai à Biblioteca, e encontra-a, aparentemente até vai buscar algumas estruturas e macros sem problemas, mas aquelas funções ele não consegue ir buscar.

#include "SDL.h"
#include "SDL_ttf.h"
int main(void) {
   SDL_Surface *Hello = NULL;
   SDL_Surface *Screen = NULL;
   SDL_Init( SDL_INIT_EVERYTHING );
   return 0;
}

E o erro de compilador é:

Undefined Reference to 'SDL_Init'

Só que já fui ver a biblioteca SDL.h e está lá a função, como podem ver.

/*
   SDL - Simple DirectMedia Layer
   Copyright (C) 1997-2012 Sam Lantinga
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   Sam Lantinga
   slouken@libsdl.org
*/
/** @file SDL.h
*  Main include header for the SDL library
*/
#ifndef _SDL_H
#define _SDL_H
#include "SDL_main.h"
#include "SDL_stdinc.h"
#include "SDL_audio.h"
#include "SDL_cdrom.h"
#include "SDL_cpuinfo.h"
#include "SDL_endian.h"
#include "SDL_error.h"
#include "SDL_events.h"
#include "SDL_loadso.h"
#include "SDL_mutex.h"
#include "SDL_rwops.h"
#include "SDL_thread.h"
#include "SDL_timer.h"
#include "SDL_video.h"
#include "SDL_version.h"
#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif
/** @file SDL.h
*  @note As of version 0.5, SDL is loaded dynamically into the application
*/
/** @name SDL_INIT Flags
*  These are the flags which may be passed to SDL_Init() -- you should
*  specify the subsystems which you will be using in your application.
*/
/*@{*/
#define SDL_INIT_TIMER  0x00000001
#define SDL_INIT_AUDIO  0x00000010
#define SDL_INIT_VIDEO  0x00000020
#define SDL_INIT_CDROM  0x00000100
#define SDL_INIT_JOYSTICK 0x00000200
#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */
#define SDL_INIT_EVENTTHREAD 0x01000000 /**< Not supported on all OS's */
#define SDL_INIT_EVERYTHING 0x0000FFFF
/*@}*/
/** This function loads the SDL dynamically linked library and initializes
*  the subsystems specified by 'flags' (and those satisfying dependencies)
*  Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup
*  signal handlers for some commonly ignored fatal signals (like SIGSEGV)
*/
extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);
/** This function initializes specific SDL subsystems */
extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags);
/** This function cleans up specific SDL subsystems */
extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);
/** This function returns mask of the specified subsystems which have
*  been initialized.
*  If 'flags' is 0, it returns a mask of all initialized subsystems.
*/
extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags);
/** This function cleans up all initialized subsystems and unloads the
*  dynamically linked library.  You should call it upon all exit conditions.
*/
extern DECLSPEC void SDLCALL SDL_Quit(void);
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif
#include "close_code.h"
#endif /* _SDL_H */

Agora, não sei porque é que isto está a acontecer. Já me disseram que poderia ser do linker do compilador com essa biblioteca, e segundo sei o linker é uma ligação do compilador à biblioteca. Eu configurei o IDE para ir buscar à pasta onde estão estas bibliotecas, mas isso não me parece problema porque ele efetivamente encontra as bibliotecas, não reconhece são as suas funções. Mas pelos vistos reconhece por exemplo o tipo de dados "SDL_Surface".

Já me aconselharam a colocar "#undef _SDL_H" no início. Não resultou, obviamente.

Estou nisto há quase dois dias. Estou a perder imenso tempo nesta questão, tempo que podia estar a aprender a trabalhar com a biblioteca e estou bastante frustrado. Como sou novo no Linux não compreendo muito bem o funcionamento das flags ainda.

Peço um bocado de paciência mas ainda assim ajuda nesta questão que me está a atordoar completamente.

Muito obrigado, desde já.

Share this post


Link to post
Share on other sites
Flinger

Que IDE estás a usar? Onde tens a pasta com a biblioteca do SDL? Estás a fazer include à pasta do SDL?

Tenta colocar no Header #include "SDL/SDL.h"

Edited by Flinger

Share this post


Link to post
Share on other sites
Dexter's Lab

O caminho é o seguinte:

"/usr/include/SDL"

Foi para onde instalou automaticamente dos repositórios. Já pus o compilador a procurar lá por bibliotecas.

Já experimentei "SDL/SDL.h" e continua na mesma. "SDL", "SDL.h"..

Share this post


Link to post
Share on other sites
Flinger

Não conheço o codeblocks para te poder ajudar mais, mas a única coisa que me vem à cabeça é exactamente não estar a linkar a biblioteca. Algures na opções do codeblocks tens de ter opção para isso (-l).

Share this post


Link to post
Share on other sites
pikax

isso e' problemas do linker... linka as bibliotecas direito!

EDIT: Tens que linkar a SDL.a e SDLmain.a

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
Dexter's Lab

Mas é precisamente isso que não sei o que é nem como fazer. O que é Linkar a biblioteca? Não é indicar ao compilador a pasta dos includes? Se não for, agradecia uma explicação, se não se importassem.

Obrigado

Share this post


Link to post
Share on other sites
polska

Mas é precisamente isso que não sei o que é nem como fazer. O que é Linkar a biblioteca?

Obrigado

Eu no Visual Studio ainda me lembro como se fazia mais ao menos, mas com Code Blocks não sei mesmo..

Já agora, quando começei com SDL, em linux também, optei por usar o terminal para compilar os programas.. revelou-se tudo muito mais fácil, aconselho-te a ver como funciona.

Dá uma olhadela aqui, tens ai como fazer o set up do SDL em IDE's no windows ou linux, e também linha de comandos...

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Share this post


Link to post
Share on other sites
Dexter's Lab

Obrigado pela ajuda. Vou ver o link que me mandaste.

Se entretanto alguém me souber dizer como posso faze-lo com o Code::Blocks gostaria de saber, mesmo tendo já alguma forma alternativa de resolver o problema.

Share this post


Link to post
Share on other sites
HappyHippyHippo

vou dizer de olhos fechados porque não uso esse IDE, gosto mais do meu : linha de comandos

no Project/target options terás de escolher a opção build options para o target escolhido e adicionar a opção do linker (numa caixa de texto)

-lSDL

só isso, SDL_main é para alterar o entry point do windows (WinMain)

isto para cada target, porque se fizeres na configuração global, estarás a linkar o SDL para todos os projectos que criares ...

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

Muito obrigado HHHippo! Estive perto de 16 horas integralmente de volta disto. Fui a fóruns, fui a tutoriais, documentação... Cheguei a perceber o problema: que ele não linkava a biblioteca. Mas não sabia o que isso quereria dizer e principalmente como contornar a situação. Mais documentação, mais fóruns americanos, stack overflow, ninguém me soube dar uma resposta objectiva e clara para quem se iniciou agora no Linux e nesses conceitos "backstage" de programação.

As respostas deste fórum foram mais úteis do que as de qualquer outro, inclusive do StackOverflow.

A tua solução resultou, HHHippo, e no entanto agradeço também ao polska, Flinger e pikax pelas respostas que foram úteis.

Agradecia também qualquer indicação de tutoriais ou documentação que me pudessem dar para começar a aprender tanto Linux como esta vertente que poderemos chamar de "burocrática", que tem a ver com isto mesmo: conhecimento dos ficheiros necessários, o que é o linker, o dll, etc, e até compilar pela linha de comandos... Se souberem onde posso aprender sobre isso e me pudessem indicar algumas fontes, seria de todo o meu interesse.

Mais uma vez, obrigado, foi um alívio resolver isto.

Share this post


Link to post
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.