发新话题
打印

编译问题

编译问题

我在编译一个基于SDL开发的程序是提示错误  #  /tmp/ccCxlEey.o(.text+0xlf8):in function 'main';
+ T2 R" C" q3 Y' ?  O                                                                                      test.c:undefined reference to 'IMG_Load'
: _8 F: M# K) B: r$ c9 g+ M                                                                                      collect2:ld  返回 1      

TOP

你觉得象是什么问题?      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

[QUOTE=flag]你觉得象是什么问题?[/QUOTE]我刚接触linux下编程,所以不懂,麻烦各位帮我看看是什么问题
& W0 Y" A) l% e程序代码
0 H1 j" C0 K7 F
( Y1 q% ]& P" f0 |9 c$ v4 T/ p#include <stdio.h>     
- o* B& G2 |7 O. z2 e' @+ [0 o, e#include <stdlib.h>. R5 [- @+ \5 y# R
#include <SDL.h>, F; Q& H+ @+ j+ H
#include <SDL_image.h>
. z1 v# f& H  D! g8 g#define DIR_UP    08 M/ x! o3 a! Y' r
#define DIR_LEFT  1
7 v: o" @# P4 }  F7 h( I#define DIR_DOWN  2; e0 E6 Q' i( l0 o: @
#define DIR_RIGHT 3
" T  W/ e( o2 k8 lSDL_Surface *screen;! f+ e( n$ R7 M4 ?
typedef struct Sprite_t {   
% {- l# `; f! x. j' x' u, ~  int width;
3 e1 C9 x9 C& {  int height;5 y- K% ?+ i4 X( I
  int x;
9 A/ @' _5 R5 I9 L/ C  int y;
. l) T; j& H# R! Q( s: `4 j. h( a  int ox;
! m9 D$ f" ?5 t' l+ K1 p. |, n  int oy;* m* X9 X; Y9 q3 _' n
  int dir;, ?6 a7 C. b" C+ `; s  o
  int subframe;
2 C; d) [! B, b% J  int speed;
% V) z0 V# t8 y5 k  int timer;
1 K# e; X* e# b  k+ E/ _& D# ?  int moving; //use to calculate subframe
) O' n5 m% G" n; d6 o" t9 \3 N! f  SDL_Surface *image;) w# ]; _2 I  U+ ^9 U
}Sprite_t;
  c# l7 H9 n% _; ]7 P: c9 {typedef enum GameState {   % Q  b$ d& a" X
  GAME_RUNNING,) L! O9 G7 T- K
  GAME_OVER,. \: I9 K* q4 X( M+ F+ o
}GameState;7 u0 F; L. ^) a% @: d) u
void Init_SDL()            
+ v+ P& U4 _. K" J2 R{: p* h) @8 Z) I3 ^& f6 ^
  if ( SDL_Init( SDL_INIT_VIDEO) < 0 ) {
) T7 ~9 g- j$ C    fprintf(stderr,"Can't init SDL: %s\n",SDL_GetError());
& A5 h3 b% F8 M0 v. r: l    exit(1);
" b$ D. G! y% C$ r$ c' N  }# b& b( v) k" e$ o
  screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);1 q  D5 l5 N9 ~4 g# w
  if ( screen == NULL ) {( C3 _! `4 H  H. N
    fprintf(stderr, "Error: %s\n",SDL_GetError());. m: d4 j( E( S  }# D$ }8 q
    exit(1);
7 i5 Q, X3 f, M2 E: q$ s( s  }
, ^" w2 e$ }7 M; Q7 L  i9 U  atexit(SDL_Quit);
1 [3 g, D$ @* w9 [- H( q}0 t& P# ?2 h# O* _" e2 z" H0 N
void DrawSprite(SDL_Surface *surface,Sprite_t *sprite)  ; g' p7 ]- L  R2 q( t0 @6 C
{
* A6 S: H6 c9 W1 {% ~; G8 q  SDL_Rect src_rect,des_rect;
+ C' S: O6 C- P1 S7 G3 v& q  sprite->subframe=sprite->timer/4;      # b$ @9 M/ U) N3 `
  src_rect.w=des_rect.w=sprite->width;, c1 Z9 f& I1 P1 i" A
  src_rect.h=des_rect.h=sprite->height;, u/ ]7 n, N0 C; J% ?$ a. `, F
  src_rect.x=sprite->subframe*sprite->width;
* T  I% |$ m0 c: O' M  src_rect.y=sprite->dir*sprite->height;9 P2 d/ Y3 K4 Q% h4 V3 s
  des_rect.x=sprite->x;* j) Q: j7 m6 R8 k- s: _
  des_rect.y=sprite->y;
2 ^4 \9 U! q! b8 l  //Draw sprite to new position + Q- A. E! Q% ?$ q7 l. x$ p2 Y1 d
  SDL_BlitSurface(sprite->image,&src_rect,surface,&des_rect);
! @$ o; J& k1 p6 @0 a. ?}6 f3 ^2 V* z* ~+ ~
void ClearSprite(SDL_Surface *surface,Sprite_t *sprite)  
* p0 Q8 c# q+ I; W2 d{8 b) V- F2 p* e/ c
  SDL_Rect mask;- t7 [- r' ^; |" [' ?, I. n
  mask.w=sprite->width;
% ~$ [- M  C* S" T  mask.h=sprite->height;4 t0 Z$ B; _$ b6 G* ~% z/ Z
  mask.x=sprite->ox;
1 ~8 h3 S5 h0 p' Y  mask.y=sprite->oy;
" H5 j. y  E' h4 x  //Clear sprite from the old position
. ]: A3 s3 R  b; T  SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,0,0,0));1 b& D6 Y% P- Q& p
}
+ F( w& V# Z( i0 sUint32 TimeLeft()   / e& v# ]- A; D/ M9 H, H
{: A' x2 {( ^9 K. I, _( {
  static Uint32 next_time=0;; e3 U. h5 r4 h, U
  Uint32 now;
7 l: I; f3 ^0 x' Y  now=SDL_GetTicks();
' B( \7 s* w6 p5 P) P* L  if(next_time<=now){
0 p. e9 V- p: H4 T  Z8 q, E. v    next_time=now+30;
( T' v0 L1 ^+ a; z& z6 e" u    return(0);
- q9 ]& m8 S! f. t: l$ j  }
4 }  L/ d4 J" G; L% M( q% i  return(next_time-now);3 t' a7 x; y! ?0 S$ k& Y! k' f
}
+ I+ W8 y" i2 y% u
: g- _1 M8 v% A& u/ z3 X+ T, A; }% ^4 E/ l6 q
int main(): t0 A9 i2 h4 g  Y! G& i% C
{) A( u& i5 b, N0 P  M
    GameState game_state;
( t3 Y2 y/ ]/ K5 x) I  I2 G; M/ V    Sprite_t tank;
' O# A0 y* m' u) S! @" v    SDL_Event event;
5 h# a5 L# F( A+ k5 m) |; [4 n( e* g$ ^    Init_SDL();+ t' h1 y4 R; R1 R) n2 J
    tank.image=IMG_Load("tank.png");3 ]/ j1 Y  L# g" X6 s8 M: e
    SDL_SetColorKey(tank.image,SDL_SRCCOLORKEY,SDL_MapRGB(tank.image->format,255,0,255));
/ ], t' N& q. ]    tank.image=SDL_DisplayFormat(tank.image);
' J5 ?4 M9 G$ t  s+ O0 w# Z    game_state=GAME_RUNNING;, |- R6 y; A) \/ X* u
    tank.dir=DIR_RIGHT;
# p, S5 M$ h( T' K4 V# r    tank.width=32;
( o: [$ T$ G! t# t    tank.height=32;
, _, }' D, K7 O  L3 r    tank.x=300;  E% H. g% z" E' h/ D8 `+ S- }
    tank.y=200;
, m& L; [  n- l, n+ H" Y  ?* m    tank.ox=tank.x;3 Q, W$ ?) b$ b9 G) }0 s) C
    tank.oy=tank.y;- E' w# ~" N/ N+ c$ I* X
    tank.moving=0;5 x, e, n* F! c& i) W, {) i1 B( T
    tank.speed=3;
; U1 }3 X/ W8 |! X2 s8 y    tank.timer=0;
5 T! e" p( ~' f  f; u  while(game_state==GAME_RUNNING){$ L2 p% K/ n1 J' U3 u/ G
        ClearSprite(screen,&tank);( |3 G8 ]: Y: [0 U4 f
        //Get Input/ K7 `7 ^7 R9 ]1 P( @# m
        SDL_PollEvent(&event);
- ~, Z* _' Q: q  f        switch(event.type){
" R& T# I, L* `/ d            case SDL_KEYDOWN:                 9 W% T9 l/ f9 J3 N% C3 B
                switch(event.key.keysym.sym){
  k' p5 q5 j/ R8 L4 F* ?( J6 z                    case SDLK_ESCAPE:
" |2 Q3 W) E# e5 n7 L  s1 |4 B                        game_state=GAME_OVER;
" T2 {( s* `# p/ v; y2 V! G4 e4 Z+ r                        break;! C, h5 I3 }# n% _
                    case SDLK_UP:& p$ F# d' k/ L1 |3 ]* `
                        tank.dir=DIR_UP;
" h0 A' w4 K9 O0 z6 ]  K                        tank.y-=tank.speed;5 H7 `( l  Q9 a# ~
                        break;7 j! B" e1 ]3 H) j
                    case SDLK_DOWN:( O6 T1 F# }. d! f+ N3 m
                        tank.dir=DIR_DOWN;* R$ j$ a. k. u: k7 d% x
                        tank.y+=tank.speed;
+ n5 i4 [7 n& d4 V5 g                        break;
" a* O! u% i0 V; }9 j' t# f" B- T& A1 s                    case SDLK_LEFT:& J2 ?4 F; Z. `! F! T. F  z) C
                        tank.dir=DIR_LEFT;1 Y5 K% Y& @. m5 T
                        tank.x-=tank.speed;8 }8 K: j, ]( r" N0 \# ^; I
                        break;3 Y$ [: X! ?/ r. Z- m" T) D( ?
                    case SDLK_RIGHT:& H% ]7 o4 ?& M' `2 G: C& C: p
                        tank.dir=DIR_RIGHT;" S; W, ?" |$ h/ O  ^7 y
                        tank.x+=tank.speed;
* R$ Z$ ?1 ], s# P, |                        break;0 d- x# R2 b: {! n& x+ b/ @
                    default:
2 q$ G8 v" e* k' o( l/ U4 b                        break;/ g. g) T0 F5 A0 }; u0 g  c1 P
                }
% d- c$ C9 F9 _* i) E. d            case SDL_KEYUP:                     
" u) `& q# F  C0 }                break;+ {7 ^& g! r# G8 }
            default:
" M. `9 X8 i# H' o& d) x                break;  ^4 ^: h' J  ~' Y0 h4 z) W
        }1 x: W. @; ?# N! v( I" D% x
        
3 P! S' I1 f; {        DrawSprite(screen,&tank);
+ u( t- z4 z8 t' R* b$ u9 \        tank.ox=tank.x;
/ _' q" X; t8 X  x        tank.oy=tank.y;  
9 q5 T" y; W, q        SDL_UpdateRect(screen,0,0,0,0);" U3 r% D9 r7 ]/ x$ l3 x
        SDL_Delay(TimeLeft());                     
; I6 X+ u1 I3 z$ R$ s5 z# ?+ K, v        tank.timer++;
* `" E+ Q' W- |3 r        tank.timer%=8;$ i8 ^% \4 f% j
  }8 k* G1 F4 c; W2 O3 ~% T# _5 k
    SDL_FreeSurface(tank.image);
+ X! Y- W3 _5 Q3 g4 {, |$ N}      

TOP

象楼主这样的我建议不要上来就弄复杂的开发,多看书弄明白程序应该怎么写,搞明白程序编译的过程,然后在借助第三方的开发库做深入的开发比较好。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

简单的我已经试说了可以的,可这个就不行,我等用这个程序,能帮我调试一下吗,谢谢      

TOP

就是 tank.image=IMG_Load("tank.png"); 这个语句有问题      

TOP

那只能说抱歉喽,因为我也没有环境。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

多谢楼上的解答,我写的用户程序中调用fread,在驱动程序中却发现调用了write_room和write,其中的原因到现在还没有弄清,还望明白的人帮忙解释一下,还有,为什么必须以tty_insert_flip_char(ttt, '\n',TTY_NORMAL);结束,tty核心才将数据推向用户?* E4 g) f/ U0 d& r+ s( Z# r
多谢!!:p      

TOP

发新话题