本文目錄一覽:
- 1、如何編譯linux驅動模塊
- 2、如何編譯預置obj 文件
- 3、如何編譯一個linux下的驅動模塊
- 4、module-objs := test.o有什麼作用?
- 5、jdk nginx. redis 在arm和x86要分別編譯
如何編譯linux驅動模塊
第一步:準備源代碼
首先我們還是要來編寫一個符合linux格式的模塊文件,這樣我們才能開始我們的模塊編譯。假設我們有一個源文件mymod.c。它的源碼如下:
mymodules.c
1. #include linux/module.h /* 引入與模塊相關的宏 */
2. #include linux/init.h /* 引入module_init() module_exit()函數 */
3. #include linux/moduleparam.h /* 引入module_param() */
4
5. MODULE_AUTHOR(“Yu Qiang”);
6. MODULE_LICENSE(“GPL”);
7
8. static int nbr = 10;
9. module_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; inbr; i++)
15. {
16. printk(KERN_ALERT “Hello, How are you. %d/n”, i);
17. }
18. return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23. printk(KERN_ALERT”I come from yuer’s module, I have been unlad./n”);
24.}
25.
26. module_init(yuer_init);
27. module_exit(yuer_exit);
我們的源文件就準備的差不多了,這就是一個linux下的模塊的基本結構。第9行是導出我們的符號變量nbr。這樣在你加載這個模塊的時候可以動態修改這個變量的值。稍後將演示。yuer_init()函數將在模塊加載的時候運行,通過輸出的結果可以看到我們的模塊是否加載成功。
第二步:編寫Makefile文件
首先還是來看看我們Makefile的源文件,然後我們再來解釋;
Makefile
obj-m := modules.o #要生成的模塊名
modules-objs:= mymod.o #生成這個模塊名所需要的目標文件
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
ARM平台
Makefile
obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25 #如果是用於arm平台,則內核路徑為arm內核的路徑
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o
在arm板上插入是
insmod mymod
如果出現以下錯誤
insmod: chdir(/lib/modules): No such file or directory
則運行
mkdir /lib/modules/2.6.25 (與arm內核版本相同)
並將mymod.ko文件複製到該目錄下
cp mymod.ko /lib/modules/2.6.25
然後再執行 (insmod 只在/lib/modules/2.6.25目錄下查找相關驅動模塊)
insmod mymod
現在我來說明一下這個Makefile。請記住是大寫的Makefile而不是小寫的makefile;
obj-m :這個變量是指定你要聲稱哪些模塊模塊的格式為 obj-m := 模塊名.o
modules-objs :這個變量是說明聲稱模塊modules需要的目標文件 格式要求 模塊名-objs := 目標文件
切記:模塊的名字不能取與目標文件相同的名字。如在這裡模塊名不能取成 mymod;
KDIR :這是我們正在運行的操作系統內核編譯目錄。也就是編譯模塊需要的環境
M= :指定我們源文件的位置
PWD :這是當前工作路徑$(shell )是make的一個內置函數。用來執行shell命令。
第三步:編譯模塊
現在我們已經準備好了我們所需要的源文件和相應的Makefile。我們現在就可以編譯了。在終端進入源文件目錄輸入make
運行結果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic’
CC [M] /home/yuqiang/桌面/mymodule/mymodules.o
LD [M] /home/yuqiang/桌面/mymodule/modules.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/yuqiang/桌面/mymodule/modules.mod.o
LD [M] /home/yuqiang/桌面/mymodule/modules.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic’
第四步:加載/卸載我們的模塊
從上面的編譯中我可以看到。已經有一個modules.ko生成了。這就是我們的模塊了。現在我們就可以來加載了。
首先在終端輸入:sudo insmod modules.ko
現在我們來看看我們的模塊加載成功沒有呢?
在終端輸入:dmesg | tail -12 這是查看內核輸出信息的意思。tail -12 顯示最後12條;
顯示結果如下:
[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
[18046.790019] usb 5-8: USB disconnect, address 9
[19934.224812] Hello, How are you. 0
[19934.224817] Hello, How are you. 1
[19934.224818] Hello, How are you. 2
[19934.224820] Hello, How are you. 3
[19934.224821] Hello, How are you. 4
[19934.224822] Hello, How are you. 5
[19934.224824] Hello, How are you. 6
[19934.224825] Hello, How are you. 7
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
看到了吧。我們的模塊的初始化函數yuer_init();已經成功運行了。說明我們的模塊已經加載成功;
現在我們再來卸載模塊試試看。
在終端輸入:sudo rmmod modules
在終端輸入:dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer’s module, I have been unlad.
可以從打印的信息中看到,我們的模塊的退出函數已經被執行了。說明我們的模塊已經被成功的卸載了。到目前位置我們就已經算是對模塊的編譯到編譯運行算是有了一個整體上的認識了。對於以後深入的學習還是應該有點幫助的。下面我們將在看看於模塊相關的一些簡單的操作。
第五步:加載模塊時傳遞參數
在終端輸入:sudo insmod module_name.ko nbr=4
在終端輸入:dmesg | tail -6
顯示結果如下:
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile module, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3
這樣我們就可以看到在模塊加載的時候動態設置了我們的一個變量。初始化函數中的循環只執行了4次。
可能你會問我怎麼知道一個模塊可以設置那些變量呢。當然,你可以先不設變量加載一次。然後可以在終端輸入ls /sys/module/modules_name/parameters/來查看。在這裡我們是這樣輸入的
在終端輸入:ls /sys/moedle/modules/parameters/
顯示結果:
nbr
如果我們的模塊加載成功了。最後我們還可以通過modinfo來查看我們的模塊信息。如下
在終端輸入:sudo modinfo modules.ko
顯示結果:
filename: modules.ko
license: GPL
author: Yu Qiang
srcversion: 20E9C3C4E02D130E6E92533
depends:
vermagic: 2.6.24-24-generic SMP mod_unload 586
parm: nbr:int
如何編譯預置obj 文件
1. 如何在preloader 中預置obj 文件?
Branch: GB, GB2, ICS, ICS2, JB, JB2
Step1. 首先獲取obj 文件,如果是preloader 已有的Source code 需要預置為obj 文
件,那麼可到如下路徑獲取obj 文件:mediatek/[source]/preloader/out
Step2. 在mediatek/[source]/preloader 目錄下創建文件夾:myobjs,將Step1 中獲取
的obj 文件放到該文件夾中
Step3. 修改mediatek/[source]/preloader/Makefile 文件,在該文件如下Code:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
之前添加:
MYOBJS := $(D_ROOT)/myobj
Step4. 修改mediatek/[source]/preloader/Makefile 中$(D_BIN)/$(PL_IMAGE_NAME).elf
生成命令,將MYOBJS 加入:如下:
$(D_BIN)/$(PL_IMAGE_NAME).elf:
$(LD) –gc-sections -Bstatic -T$(MTK_PATH_PLATFORM)/link_descriptor.ld \
$(wildcard $(D_OBJ)/*) $(wildcard $(MYOBJS)/*) $(SECURITY_LIB) -Map
system.map -o $(D_BIN)/$(PL_IMAGE_NAME).elf
Step5. 如果添加的obj 文件在preloader 中有對應的Source code,還需要修改
Source code 對應的make File 文件,將該Source code 從make File 文件中刪除,以
bmt.c 為例,需要修改medaitek/platform/$platform/preloader/src/drivers/makefile,
將bmt.c 從該文件的MOD_SRC 中刪除
說明:preloader 的Source code 位於如下路徑:
– mediatek/platform/$platform/preloader/
– mediatek/custom/$platform/preloader/
– mediatek/custom/common/preloader/
– mediatek/custom/$porject/preloader/
2. 如何在uboot 中預置obj 文件?
Branch: GB, GB2, ICS, ICS2
Case1. 該obj 文件是從第三方處獲取,在codebase 原本不存在.c 文件,不需要編
譯進某個lib 文件
Step1. 首先獲取obj 文件
Step2. 在bootable/bootloader/uboot 目錄下添加myobjs 文件夾,將Step1 中獲取的
obj 文件放到該文件夾中
Step3. 修改bootable/bootloader/uboot/Makefile,在該文件如下Code:
GEN_UBOOT = \
之前添加:
MYCUSTOMOBJS := $(wildcard myobjs/*)
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
loginid=zhanghui@vanzotec.com,time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中預置obj文件.docx,company=Vanzo_WCX
Step4. 修改bootable/bootloader/uboot/Makefile,將MYOBJSDIR 中的obj 文件添加
到u-boot 的生成命令中,如下:
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e ‘s/.*$(SYM_PREFIX)__u_boot_cmd_.*/-u\1/p’|sort|uniq`;\
cd $(LNDIR) $(LD) $(LDFLAGS) $$UNDEF_SYM $(MYCUSTOMOBJS)
$(__OBJS) \
Case2. 該obj 文件在Codebase 中存在對應的.c 文件,現在需要將.c 文件刪除,替
換為obj 文件
Step1. 編譯生成obj 文件,uboot 編譯生成的obj 文件與其.c 文件位於同級目錄下
Step2.在原先obj 文件目錄下創建一個文件夾prebuilt,並將obj 文件放入其中,同
時將.c 文件刪除
Step3. 修改包含該.c 文件的Makefile 文件(一般與.c 文件位於同級目錄下),將該obj
文件的名稱從OBJS 變量中刪除,同時在該Makefile 中添加一個變量,MYOBJS,將
該obj 文件添加到MYOBJS 中,以
bootable/bootloader/uboot/drivers/video/cfb_console.c 為例,修改該目錄下的
Makefile 文件,將cfb_console.o 從變量OBJS 中刪除,同時添加一行:
MYOBJS := cfb_console.o
Step4. 繼續修改Step3 中的Makefile,將MYOBJS 添加到生成LIB 的命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
Case3. 某些模塊,Uboot 和kernel 共用同一份Source code,比如LCM,這種情況
需要做特殊處理,以LCM 為例,如下:
Step1. 首先編譯出obj 文件,路徑位於:mediatek/custom/out/$project/uboot/lcm,
同時將要替換的Source code 刪除(mediate/custom/common/kernel/lcm)
Step2. 在mediatek/custom/$project/uboot 下面添加lcm 文件夾,同時將Step1 中獲
取到的obj 文件添加到該文件夾下,同時將原目錄下的obj 文件刪除(這裡獲取的
obj 文件一定要是Uboot 目錄下的,不要到kernel 目錄下獲取這些obj 文件)
Step3. 修改mediatek/custom/common/uboot/Makefile 文件,將要替換的obj 文件
名稱從COBJS 刪除:COBJS += $(patsubst %.c, %.o, $(wildcard lcm/*.c))
Step4. 繼續修改Step3 中的Makefile,添加如下Code:MYOBJS := $(addprefix $(obj),
$(wildcard lcm/*.o)),同時將MYOBJS 添加到$(LIB)的編譯命令中,如下:
$(LIB): $(OBJS) $(SOBJS)
$(AR) $(ARFLAGS) $@ $(OBJS) $(MYOBJS) $(SOBJS)
說明:Uboot 的Source Code 主要位於如下路徑:
– bootable/bootloader/uboot/
– mediatek/platform/$platform/uboot/
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
loginid=zhanghui@vanzotec.com,time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中預置obj文件.docx,company=Vanzo_WCX
– mediatek/custom/$platform/uboot/
– mediatek/custom/common/uboot/
– mediatek/custom/$porject/uboot/
3. 如何在kernel 中預置obj 文件?
Branch:GB, GB2, ICS
– 比如要將xxx.c 用xxx.o 替代編譯
– 先正常編譯出xxx.o
– 然後在xxx.c 所在目錄下創建prebuilt 目錄,將xxx.o 放入
• 注意prebuilt 目錄的目錄名不能修改,否則在clean 階段會被清除
– 修改xxx.c 所在目錄下的Makefile 文件,原本已經有obj-y := xxx.o,在其後
面添加xxx-y := prebuilt/xxx.o 即可
– mediatek/custom/[XXX]/kernel 目錄下對應的Source Code 沒有Makefile 文件,
自己在Source code 對應的同級目錄下添加一個Makefile 即可
Branch:ICS2, JB, JB2
– 比如要將debug.c 用debug.o 替代編譯
– 先正常編譯出debug.o (針對kernel 和lk, uboot 共用Source Code 的情況,
如LCM,這裡獲取 到的obj 文件一定要是kernel/out 目錄下的)
– 然後將debug.o 複製到原先debug.c 所在目錄下,並重命名為
debug.o_shipped
– 原先debug.c 同級目錄下的Makefile 不變,依然保持為
obj-y:=debug.o;mediatek/custom/[XXX]/kernel 目錄下對應的Source Code 沒有
Makefile 文件,自己在Source code 對應的同級目錄下添加一個Makefile 即可
– 重新編譯kernel 即可
說明:kernel 的Source code 主要位於如下路徑:
– kernel/
– mediatek/platform/$platform/kernel/
– mediatek/[source]/kernel/
– mediatek/custom/$platform/kernel/
– mediatek/custom/common/kernel/
– mediatek/custom/$porject/kernel/
4. 如何在lk 中預置obj 文件
Branch:JB,JB2
Step1. 在bootable/bootloader/lk/makefile 中添加:MYOBJ :=
Step2. 獲取obj 文件,Codebase 編譯生成的obj 文件位於
bootable/bootloader/lk/build-$project/custom/$project/lk 目錄下
Step3. 將獲取的obj 文件放到與.c 文件相同目錄下;同時可將.c 文件刪除
MEDIATEK CONFIDENTIAL
FOR zhanghui@ vanzotec.com USE ONLY
loginid=zhanghui@vanzotec.com,time=2013-10-08 19:27:59,ip=180.166.121.198,doctitle=如何在preloader、uboot、lk、kernel中預置obj文件.docx,company=Vanzo_WCX
Step4. 將相應的.c 文件從包含該.c 文件的rules.mk(一般與.c 文件位於同級目錄)中刪
除
Step5. 將Step3 中添加的.o 文件在rules.mk 中添加到MYOBJ,比如MYOBJ += test.o
Step6. 打開bootable/bootloader/lk/make/build.mk,將MYOBJ 添加到OUTELF 的生
成命令中,如下:
else
$(OUTELF): $(ALLOBJS) $(LINKER_SCRIPT)
@echo linking $@
$(NOECHO)$(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) $(ALLOBJS)
$(MYOBJ) $(LIBGCC) -o $@ endif
Step7. 如果要替換的.c 文件是lk 與kernel 共用的,比如lcm 模塊,那麼Step2 需要
做一下修改:將獲取的obj 文件放到mediatek/custom/$project/lk/lcm 中,同時要
確保這裡獲取的obj 文件是bootable/bootloader/lk/build-
$project/custom/$project/lk 目錄下的,不要到kernel/out 目錄下獲取這些obj 文件
說明:lk 的Source Code 主要位於如下路徑:
– mediatek/platform/$platform/lk/
– mediatek/custom/$platform/lk/
– mediatek/custom/common/lk/
– mediatek/custom/$porject/lk/
– bootable/bootloader/lk/
MEDIATEK CONFIDENTIAL
如何編譯一個linux下的驅動模塊
這是一個簡單而完整的實例,對於理解Linux下的驅動模塊是非常有幫助的。
1.源碼如下:
/*
* hello.c — the example of printf “hello world!” in the screen of driver program
*/
#include linux/init.h
#include linux/module.h
MODULE_LICENSE(“Dual BSD/GPL”);/* declare the license of the module ,it is necessary */
static int hello_init(void)
{
printk(KERN_ALERT “Hello World enter!\n”);
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT “Hello world exit!\n”);
}
module_init(hello_init); /* load the module */
module_exit(hello_exit); /* unload the module */
進入目錄:
[root@Alex_linux /]#cd /work/jiakun_test/moduletest
[root@Alex_linux moduletest]# vi hello.c
然後拷入上面書上的源碼。
2.編譯代碼:
1.首先我在2.4內核的虛擬機上進行編譯,編譯過程如下:
[root@Alex_linux moduletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c
其中-I選項指定內河源碼,也就是內核源碼樹路徑。編譯結果:
hello.c:1:22: net/sock.h: No such file or directory
hello.c: In function `hello_init’:
hello.c:6: warning: implicit declaration of function `printk’
hello.c:6: `KERN_ALERT’ undeclared (first use in this function)
hello.c:6: (Each undeclared identifier is reported only once
hello.c:6: for each function it appears in.)
hello.c:6: parse error before string constant
hello.c: In function `hello_exit’:
hello.c:11: `KERN_ALERT’ undeclared (first use in this function)
hello.c:11: parse error before string constant
hello.c: At top level:
hello.c:13: warning: type defaults to `int’ in declaration of `module_init’
hello.c:13: warning: parameter names (without types) in function declaration
hello.c:13: warning: data definition has no type or storage class
hello.c:14: warning: type defaults to `int’ in declaration of `module_exit’
hello.c:14: warning: parameter names (without types) in function declaration
hello.c:14: warning: data definition has no type or storage class
在網上查詢有網友提示沒有引入kernel.h
解決:vi hello.c
在第一行加入:#include linux/kernel.h
再次編譯仍然報KERN_ALERT沒有聲明
修改編譯條件-I,再次編譯:
[root@Alex_linux moduletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c
[root@Alex_linux moduletest]#ls
hello.c hello.o Makefile
[root@Alex_linux moduletest]#
2.接着我嘗試在2.6內核的虛擬機上進行編譯
編譯過程如下:
[root@JiaKun moduletest]# ls
hello.c makefile
[root@JiaKun moduletest]# vi hello.c
[root@JiaKun moduletest]# make
make -C /mylinux/kernel/2.4.18-rmk7 M=/home/alex/test/moduletest modules
make: *** /mylinux/kernel/2.4.18-rmk7: No such file or directory. Stop.
make: *** [modules] Error 2
[root@JiaKun moduletest]# vi makefile
[root@JiaKun moduletest]# make
make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686′
scripts/Makefile.build:17: /home/alex/test/moduletest/Makefile: No such file or directory
make[2]: *** No rule to make target `/home/alex/test/moduletest/Makefile’. Stop.
make[1]: *** [_module_/home/alex/test/moduletest] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686′
make: *** [modules] Error 2
[root@JiaKun moduletest]# mv makefile Makefile
[root@JiaKun moduletest]# make
make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-i686′
CC [M] /home/alex/test/moduletest/hello.o
Building modules, stage 2.
MODPOST
CC /home/alex/test/moduletest/hello.mod.o
LD [M] /home/alex/test/moduletest/hello.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-i686′
[root@JiaKun moduletest]# ls
hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile Module.symvers
3.執行代碼,加載驅動模塊:
2.4內核加載模塊:
insmod ./hello.o
但是此時並沒有輸出printk打印的信息。但是可以在/var/log/messages 中看到打印的信息,這是由於KERN_ALERT優先級不夠高。這裡
需要修改為:KERN_EMERG。再次編譯,加載模塊即可以看到結果
2.6內核加載模塊:
[root@JiaKun moduletest]# insmod hello.ko
[root@JiaKun moduletest]#
Message from syslogd@ at Sat Jul 26 19:52:44 2008 …
JiaKun kernel: Hello, world
有的朋友可能會出現insmod命令找不到的錯誤,這可能有下面幾個原因:
1 你的系統沒有安裝module-init-tools工具,關於此問題,只需安裝即可,但是一般裝完系統是有這個命令的。
2 環境變量沒有添加導致不能使用該命令。使用echo $PATH即可查看PATH環境變量,發現沒有/sbin這個路徑,所以你當然不能使用insmod這個命令了。解決的方法很簡單,只需在命令行輸入:
PATH = “$PATH:/sbin”即可添加。(insmod在/sbin這個目錄下,你可以使用whereis insmod查看)。
3 insmod這個命令需要在root權限下才能使用。
加載完成後你可以輸入lsmod查看hello這個模塊哦。
4.卸載驅動模塊:rmmod hello.
加載模塊後就可在屏幕上看到如下信息:Hello world enter.
卸載時就可在屏幕上看到如下信息:hello world exit.
[root@JiaKun moduletest]# rmmod hello.ko
[root@JiaKun moduletest]#
Message from syslogd@ at Sat Jul 26 19:52:58 2008 …
JiaKun kernel: Goodbye, cruel world
另外,如果有多個文件,則按下列方式編寫Makefile文件(file1.c、file2.c):
obj -m := modulename.o
module-objs := file1.o file2.o
module-objs := test.o有什麼作用?
module-objs 用在多.o文件編譯的時候。
解釋:
obj-m := test.o是指定模塊名稱是test.ko。如果只是由test.o,來編譯成test.ko,那後面的module-objs := test.o最好省略。
但是有時候,test.ko是由test.o file1.o file2.o這樣多個.o文件編譯成test.ko模塊,那需要:
obj-m := test.o
module-objs := file1.o file2.o test_main.o(注意,這裡不要用test.o)
模塊參數
Module_param(name,type,perm)
Name是模塊參數的名稱,type是這個參數的類型,
Perm是模塊參數的訪問權限
Type常見值
Bool,int,charp:字符串型
Perm常見值:
S_IRUGO:任何用戶都對/sys/module中出現的該參數具有讀權限
S_IWUSR:允許root用戶修改/sys/module中出現的該參數
例如:
Int a = 3;
Char *st; (不用初始化,內核給它分配空間)
Module_param(a,int,S_IRUGO);
Module_param(st,charp,S_IRUGO);
jdk nginx. redis 在arm和x86要分別編譯
一、注意openssl和pcre只需要把源碼解壓縮,不需要單獨交叉編譯!
開始的時候不知道,傻傻的把這兩個庫弄半天把它們編譯過去了。誰知道nginx的–with-pcre和–with-openssl選項,指定的是這兩個庫源代碼的路徑,並非安裝路徑!nginx的編譯系統只會從/usr、/usr/local等少數幾個目錄查找是否有預編譯的pcre、zlib、openssl等庫。對於交叉編譯,直接把交叉編譯後的pcre等安裝在/usr、/usr/local顯然不合適,因此需要使用–with-pcre和–with-openssl指定源代碼的位置
二、交叉編譯nginx
在x64 linux上面編譯非常簡單的nginx,沒想到在交叉編譯的時候巨多坑。下面一個configure是編譯成功的配置
進入/usr/local/src目錄,創建nginx文件夾。入剛創建的nginx目錄,下載nginx的tar包,解壓,進入解壓生成的目錄,進行配置(後面有補充,建議通讀一遍)編譯安裝查找安裝路徑,在執行make編譯時,可以添加要編譯的參數,已安裝完成,比如我現在要新增 http_stub_status_module 模塊參數,那麼我只要把該參數添加進去然後重新編譯即可,需要注意的是原先編譯過的參數也要加進來。
進入nginx的安裝目錄,因為我安裝的時候沒有添加任何參數,所以這裡我只需要執行
我這裡只需要這一個模塊,如果你安裝的nginx還使用其他的模塊,記得在上面的編譯命令中加上。
另外,這裡只能 make 千萬別 make install,否則就覆蓋安裝了。
make完成後,在源碼目錄下會有一個objs目錄,objs目錄下就多了個nginx,這個就是新版本的程序了;
然後將objs目錄下的nginx替換之前已經安裝過的nginx(建議將舊的nginx程序做下備份)
,
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/247864.html
微信掃一掃
支付寶掃一掃