发新话题
打印

编译问题

编译问题

我在编译一个基于SDL开发的程序是提示错误  #  /tmp/ccCxlEey.o(.text+0xlf8):in function 'main';
5 K, o& L- y. l5 |- F                                                                                      test.c:undefined reference to 'IMG_Load'
0 z7 y+ p8 P+ \. o; s                                                                                      collect2:ld  返回 1      

TOP

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

TOP

[QUOTE=flag]你觉得象是什么问题?[/QUOTE]我刚接触linux下编程,所以不懂,麻烦各位帮我看看是什么问题+ [  l8 P% O8 o) g+ D
程序代码
& u* ]! V. M  f! c+ O7 W 4 k  [6 I* `/ l4 {2 G
#include <stdio.h>     " K2 |5 O+ M. A" G
#include <stdlib.h>
; G7 Q7 @" z# R#include <SDL.h>
  D: R9 C4 a* j6 P$ N# u0 l#include <SDL_image.h>
  \- r' p8 D! N1 |# Y#define DIR_UP    0; R/ O' W& s5 A& j0 \
#define DIR_LEFT  1. \  _6 w9 o, V! M8 V# v, v$ d9 n9 A
#define DIR_DOWN  2- m  R9 q; |  F) {8 s' R
#define DIR_RIGHT 3
: r/ T- f( f- C! wSDL_Surface *screen;9 y: F. m( F* _7 b% `2 h
typedef struct Sprite_t {   
) @8 M# ^1 f1 e( Z! c7 m( K  int width;% }3 p0 I4 M& i2 F) {6 A5 `
  int height;/ y; T( F% G" R( a& k( w/ n
  int x;
* B7 J) \5 p: W5 A& ~5 y$ S1 ]+ B8 y+ T  int y;
) J# G" i) h9 R, N- D; b  int ox;
# R  D0 H+ L1 Z7 }$ A: c/ N  int oy;4 U4 ?* t! r6 {' z2 e, z
  int dir;3 f  W1 e# V# b4 a  ~6 q4 k
  int subframe;
8 u6 p- i" Z1 n; N  int speed;
( _, _$ O% N1 c$ K5 G  int timer;
6 n+ w4 [' N: }1 t0 B2 h% _' \8 f  int moving; //use to calculate subframe" b  d* }2 o. _, N
  SDL_Surface *image;
) C2 F3 a6 I3 ]. w/ r2 g7 x6 j}Sprite_t;% G2 s  Z" Y2 g0 D4 Z( N' ~
typedef enum GameState {   
1 n) S8 s/ G6 L- _2 h  GAME_RUNNING,
+ I% \0 W) l* \3 E( L9 }  GAME_OVER,
# n- C1 w, F: m9 R' x1 g; W% L8 S}GameState;- X' ?! j, _! A$ Z
void Init_SDL()            
: u9 [+ A5 q& C{
4 v: C; }( N$ b% L  S1 f6 R7 b4 e" C  if ( SDL_Init( SDL_INIT_VIDEO) < 0 ) {9 f$ B0 ^- x1 g. ^
    fprintf(stderr,"Can't init SDL: %s\n",SDL_GetError());
/ J: }& y$ `& ]    exit(1);; h3 n$ S4 d1 k! W3 S
  }
3 k/ f+ ~/ `4 W8 K) ]  screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);- O: @6 u0 v6 H% _# `- f- Y
  if ( screen == NULL ) {0 P/ B/ q, e7 }2 g# P
    fprintf(stderr, "Error: %s\n",SDL_GetError());
- L. X- X  s, ]7 h, ^' \% a3 r    exit(1);6 Y/ q: S( a3 y
  }
' U0 w2 P% B& d0 p: V: Z  atexit(SDL_Quit);0 L/ X4 w7 u9 X& G; j
}. l. c3 Q5 b% q; H0 M
void DrawSprite(SDL_Surface *surface,Sprite_t *sprite)  * ~% ]& q# r1 N" S9 t
{  I6 |+ }' [8 @9 N
  SDL_Rect src_rect,des_rect;
" ~& ^& t) ?$ Q3 p8 {9 u, O, N  sprite->subframe=sprite->timer/4;      ( p1 Z' E( ~; Y# p
  src_rect.w=des_rect.w=sprite->width;
; w+ T# Y+ g! A  src_rect.h=des_rect.h=sprite->height;- y4 _- ]" S. ]4 i8 B: G
  src_rect.x=sprite->subframe*sprite->width;& ]5 i2 U/ h1 k$ H" W5 d& |% v, ?
  src_rect.y=sprite->dir*sprite->height;$ u& {. l  ^" c' W
  des_rect.x=sprite->x;
: O7 @; z, L1 g8 ~  des_rect.y=sprite->y;
) z5 j: I# m/ {- a( H  //Draw sprite to new position
4 N. ^: Z2 k$ H: g! l: m( q+ r  SDL_BlitSurface(sprite->image,&src_rect,surface,&des_rect);- s8 B6 A8 I, ~3 g. m: k( N
}
+ Z/ L  E3 T  E' xvoid ClearSprite(SDL_Surface *surface,Sprite_t *sprite)  5 ]4 V0 n+ s9 n% V0 I
{7 M' z' K5 ^2 M! C+ J* e
  SDL_Rect mask;7 o+ v. Y8 i$ J: H+ L+ ?/ h
  mask.w=sprite->width;3 A  m! d" S1 [# |! D# V
  mask.h=sprite->height;
4 V8 b# q- O3 `  mask.x=sprite->ox;
$ W& ~$ a2 p3 e1 R  mask.y=sprite->oy;9 V& G# t6 d7 ]1 r0 I% {3 e9 M# B. l
  //Clear sprite from the old position
9 H: X1 o# o, l" g, p  SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,0,0,0));
3 ^7 y! y; E$ q: P/ _6 a}2 O% j; L9 s' F& V! J
Uint32 TimeLeft()   1 U1 o, e1 l3 z$ a
{
% c6 J4 r/ h/ u- Q# ~  static Uint32 next_time=0;) E& Q) ]2 C5 P0 Z- ]: _
  Uint32 now;4 O5 a3 N! f6 w5 z6 d/ z
  now=SDL_GetTicks();
+ R1 n2 X7 @2 O1 I4 e0 Z9 N2 |  if(next_time<=now){
' r8 H5 h) D  G    next_time=now+30;
7 ~- _, {7 F/ Y6 _# W    return(0);  c) ^. w9 {  @* \( v7 o6 Z/ C
  }( G1 `, O9 g  Q' S" \
  return(next_time-now);% f6 j7 U- f6 U* f( _
}  _' E/ x4 J- Q! I, a$ }0 ^
7 P0 B) S# m# w. }8 {
9 U$ Q- [* k! f( ?6 e& e
int main()
! R: J% m' A1 ]7 j{
8 a% _- d$ r+ M6 R9 \  p" B    GameState game_state;
$ h5 i6 c' [; V% p0 g7 a, m% Y; ^- k    Sprite_t tank;/ u0 H/ [1 i! _! `- O2 H/ y
    SDL_Event event;% f, G3 [  C9 k- r
    Init_SDL();6 H2 V& H- P8 G8 S1 Y
    tank.image=IMG_Load("tank.png");
0 B* e2 U* v' G( o    SDL_SetColorKey(tank.image,SDL_SRCCOLORKEY,SDL_MapRGB(tank.image->format,255,0,255));. j9 n) a6 F% u$ V0 K
    tank.image=SDL_DisplayFormat(tank.image);
$ y/ h8 k# ^% Q- y, G/ v+ m    game_state=GAME_RUNNING;* `1 `+ t8 V8 q0 v9 H
    tank.dir=DIR_RIGHT;
" T# C- n0 V" h& {& ~: r& t' l    tank.width=32;! K4 s8 J1 l+ P5 n6 b
    tank.height=32;
" @5 V& \! ]" i) k* S" \. w' M    tank.x=300;
5 e/ g+ v' k5 y7 [+ u/ b+ A    tank.y=200;
/ ?( o/ E' h" N: U! b) f. Q    tank.ox=tank.x;
7 Z/ [& X, R  \/ ^$ I* h8 F* h    tank.oy=tank.y;* |! L, l) B1 Z6 Z! r9 ?
    tank.moving=0;
! p7 [* K4 ]8 Q  O0 M% C& G    tank.speed=3;5 c# u3 u; h, u. C  w  S7 \4 H! }
    tank.timer=0;
! ?4 x  U; e8 R# Y# b1 m0 U  while(game_state==GAME_RUNNING){
7 ?. n; m6 f& A4 Q7 N        ClearSprite(screen,&tank);7 `4 i* f4 k5 q8 N# H/ r8 o
        //Get Input
& c8 x1 P" r! H  f0 Q        SDL_PollEvent(&event);
9 A) t6 G- H9 V% K  i( t  d% \        switch(event.type){
! b/ V) b  t" W+ E# A2 c0 ]            case SDL_KEYDOWN:                 " k4 h; ^% g3 v8 e' u4 O# T, K
                switch(event.key.keysym.sym){3 [& Z# F' w& z& b" L
                    case SDLK_ESCAPE:
. u5 Q# d8 c, w. a/ K$ |                        game_state=GAME_OVER;* C1 u& j" _; ~' o( m/ s# U' P$ n
                        break;
6 K  l; c+ S* m: S                    case SDLK_UP:
8 Q1 K* Q5 w3 n5 _                        tank.dir=DIR_UP;
8 u$ Z+ f7 K6 E. Y9 k6 v# d                        tank.y-=tank.speed;8 J6 G2 M% ~$ @7 t
                        break;0 O5 w0 h1 c: h" {+ W/ m  |
                    case SDLK_DOWN:- o% O, n" g& Z: ^  i
                        tank.dir=DIR_DOWN;7 ^, g- h; h% N; N6 O2 ~& @) f9 Y
                        tank.y+=tank.speed;1 o9 p+ z3 ]+ I, f6 v
                        break;
( L' U' B% W* ]/ G6 }) |! n                    case SDLK_LEFT:
4 J8 E- k1 i9 n$ ~                        tank.dir=DIR_LEFT;
2 I. p2 K9 k1 C6 ]                        tank.x-=tank.speed;
& D4 G" n, \( Z; M8 a                        break;
& a* [: t/ d( M- z' N* O  f                    case SDLK_RIGHT:
' K) l4 D6 \2 k4 V                        tank.dir=DIR_RIGHT;- ?& @/ i& E/ U; P6 r* f4 w, \
                        tank.x+=tank.speed;; m* r2 e: `. G8 E& \9 j" w. Z
                        break;
& {- S; P5 F$ y+ e                    default:
. F3 ]. B" q- K' u! \                        break;+ {/ r4 _. u; m
                }
: D8 y: \+ @+ S6 l6 L9 S: |3 e( P! F3 j            case SDL_KEYUP:                     
( q1 B2 d. w! I) t  [$ X                break;
* G4 n& p6 [, u5 A! }            default:1 ~% j. M2 Y8 n2 o, q8 F2 w3 o
                break;& h' i2 k0 |$ }4 h1 Q; \5 [9 l
        }
, s' h0 u( |  s) Y8 q) A1 x( R        
8 c9 j5 A* S+ b; w5 ]( E        DrawSprite(screen,&tank);
( Y6 Q9 R% x% Y* m2 d5 x9 _- ?        tank.ox=tank.x;
" t2 `% Y8 O0 M; v: Q        tank.oy=tank.y;  7 X0 Y  u. y0 L8 w4 b8 x; G$ O
        SDL_UpdateRect(screen,0,0,0,0);2 `3 v% ^/ y5 ~3 k) X
        SDL_Delay(TimeLeft());                     ) Z1 a0 _/ R$ i9 k: h8 Q! H
        tank.timer++;; o# i& I/ y& L! g
        tank.timer%=8;+ @5 `0 C  w4 ^) o# d* ?/ C/ ]/ I/ @
  }  b5 _" d" @1 L+ b
    SDL_FreeSurface(tank.image);
. g4 |% Z2 e! Y- x0 P* r}      

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核心才将数据推向用户?
; }: ^/ X) X8 E! P. O6 a; Z多谢!!:p      

TOP

发新话题