无论是去驱动编译,还是应用编译,本质上都是用gcc这个工具,后面跟不同的参数来完成
驱动编译
放入内核编译
obj-y += $(TARGET_SDK).o,就会直接将驱动编译成.o。供内核链接的时候,链接进整个内核镜像;
obj-m += $(TARGET_SDK).o,就会直接将驱动编译成ko ,不需要像外部单独编译,来在其Makefile指定参数
外部驱动编译:-C 表示切换到指定目录(内核构建目录),M=$(PWD) 表示当前目录为模块的源代码目录 ,modules表示编译成模块
obj-m:=HelloWorld.o
KDIR:=/home/god/Desktop/raspberry/linux # path of kernel file
PWD:=$(shell pwd) # path of current file
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
@rm -rf *.mod.*
@rm -rf *.o
@rm -rf Module.*
@rm -rf modules.*
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
应用编译
交叉编译一个应用,一般需要如下几步
1.交叉编译工具:CROSS_COMPILE
2.引用的头文件目录:CFLAGS += -I
3.引用的库文件目录:LIBS += -L
比如交叉编译hostapd,需要在Makefile添加如下内容
ALL=hostapd hostapd_cli
CONFIG_FILE = .config
include ../src/build.rules
#add for platform
export STAGING_DIR= owtoolchain/linux64/initial/bin/
CROSS_COMPILE:= owtoolchain/linux64/initial/bin/arm-openwrt-linux-uclibcgnueabi-
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld
CFLAGS += -Iowtoolchain/linux64/include
CFLAGS += -Istaging_dir/target-arm_cortex-a7+neon-vfpv4_uClibc-1.0.25_eabi/usr/include/libnl3
LIBS += -Lbuild_dir/target-arm_cortex-a7+neon-vfpv4_uClibc-1.0.25_eabi/root-mmp/usr/lib
CFLAGS += -Istaging_dir/target-arm_cortex-a7+neon-vfpv4_uClibc-1.0.25_eabi/usr/include/
LIBS += -Lstaging_dir/target-arm_cortex-a7+neon-vfpv4_uClibc-1.0.25_eabi/usr/lib
#add for paltform end
...
CFLAGS += $(EXTRA_CFLAGS)
CFLAGS += -I$(abspath ../src)
CFLAGS += -I$(abspath ../src/utils)
库的编译
无论是静态库,还是动态库编译也是gcc指定不同参数实现;链接的话,可以使用同样的参数:-L指定库文件路径,-l指定库文件名字,-I指定头文件路径
静态库
编译静态库
ar -crv libfunc.a func.o
编译执行文件
gcc main.c -o main -L . -l func
运行执行文件
./main
动态库
编译动态库
gcc func.o -shared -o libfunc.so
编译执行文件
假设func动态库在当前目录下
gcc main.c -o main -L . -l func
运行执行文件
先将动态库放到可执行文件的同级目录下;或者执行如下命令(linux环境时)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库所在目录路径
然后执行可执行文件
./main