jlj1986 发表于 2009-11-20 22:36

【求助】关于Redhat linux下的交叉编译

各位高手,我是一名研究生,最近在学习linux下的USB驱动程序的编写,现在遇到一个问题,想要请教下各位。
      问题是这样的:
      我编写了一个驱动程序helloword程序:
    -----------------------------------------------------
      #define MODULE
      #include <linux/module.h>

      MODULE_LICENSE("GPL");

      int init_module(void)
      {
                printk("Hello World!\n");
                return 0;
         }

      void cleanup_module(void)
      {
                printk("Goodbye!\n");
      }
       -------------------------------------------------------
      
      在Shell命令行中输入命令:arm-linux-gcc -o hello hello.c
      
      结果出现这样的提示:
      
      /usr/local/arm/3.3.2/lib/gcc-lib/arm-linux/3.3.2/../../../../arm-linux/lib/crt1.o(.text+0x30): In function `_start':
      : undefined reference to `main'
      /tmp/cct7s4pJ.o(.text+0x10): In function `init_module':
      : undefined reference to `printk'
      /tmp/cct7s4pJ.o(.text+0x34): In function `cleanup_module':
      : undefined reference to `printk'
      collect2: ld returned 1 exit status
      
       请问这是怎么回事?我不知道该怎么解决,交叉编译要注意些什么问题呢?
   我用的交叉编译工具是cross-3.3.2,linux系统是在windows xp下用虚拟机装的Redhat 9.0,内核为2.4.20-8版本
      
   很希望能得到各位的指点,谢谢!

openspace 发表于 2009-11-20 23:31

加上#include <linux/kernel.h>


LDD3:
#include <linux/kernel.h>
int printk(const char * fmt, ...);

jlj1986 发表于 2009-11-21 08:57

原帖由 openspace 于 2009-11-20 23:31 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
加上#include


LDD3:
#include
int printk(const char * fmt, ...);


你说的头文件我都加了但是出来的结果还是:
/usr/local/arm/3.3.2/lib/gcc-lib/arm-linux/3.3.2/../../../../arm-linux/lib/crt1.o(.text+0x30): In function `_start':
: undefined reference to `main'
/tmp/ccOtPVCB.o(.text+0x10): In function `init_module':
: undefined reference to `printk'
/tmp/ccOtPVCB.o(.text+0x34): In function `cleanup_module':
: undefined reference to `printk'
collect2: ld returned 1 exit status

不知道到底是怎么了?唉,郁闷!

[ 本帖最后由 jlj1986 于 2009-11-21 08:59 编辑 ]

openspace 发表于 2009-11-21 09:28

回复 #3 jlj1986 的帖子

没有做过交叉编译
但是感觉你的交叉编译适用于用户态
不是内核态,printk是内核态才有的

参考一下这个
http://gawingsky.blogbus.com/logs/46872918.html

Godbach 发表于 2009-11-21 10:41

编译选项不全啊,你编译的是内核模块,通常得有-DMODULE选项的。

[ 本帖最后由 Godbach 于 2009-11-21 10:43 编辑 ]

luozhao1984 发表于 2009-11-21 14:05

T-Bagwell 发表于 2009-11-23 15:53

首先,你要知道你用的是什么kernel
然后编译该kernel对应版本的module
然后,你确定printk在哪个头文件里有定义
页: [1]
查看完整版本: 【求助】关于Redhat linux下的交叉编译