1. 程式人生 > >多個原始檔編譯成一個模組注意Makefile 書寫

多個原始檔編譯成一個模組注意Makefile 書寫

多個原始檔編譯成一個模組,不正確的Makefile 會使printk 不能輸出資訊。
細細觀測,發現是對Makefile 語法未深刻理解所致。 下面附上一例說明問題。
--------------------------------------------------------------------------------
簡單的測試檔案1
[[email protected] /home/samba/printk]# cat print.c
--------------------------------------------------------------------------------
#include <linux/module.h>
int mod_entry(void)
{
    printk("hello entry\n");
    return 0;
}
void mod_exit(void)
{
    printk("leave the  program\n");
}
module_init(mod_entry);
module_exit(mod_exit);

MODULE_LICENSE("GPL");
--------------------------------------------------------------------------------
簡單的測試檔案2
[
[email protected]
/home/samba/printk]# cat abc.c
--------------------------------------------------------------------------------
#include <linux/kernel.h>

void dummy(void)
{
}

--------------------------------------------------------------------------------
錯誤的Makefile. 這樣雖然生成了print.ko,
 但是隻連線了abc.o 而丟失了print.o, 當然連線了print.mod.o, 可用make V=1 觀察
[
[email protected]
/home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
    obj-m := print.o
    print-objs := abc.o
else
     PWD = $(shell pwd)
    KVER = $(shell uname -r)
    KDIR = /lib/modules/$(KVER)/build
all:
    make -C $(KDIR) M=$(PWD)
clean:
    rm *.o *.ko modules.*
endif


--------------------------------------------------------------------------------
正確的 Makefile. 生成了myprint.ko, 連線了print.o abc.o 兩個目標檔案
[
[email protected]
/home/samba/printk]# cat Makefile
--------------------------------------------------------------------------------
ifneq ($(KERNELRELEASE),)
    obj-m := myprint.o
    myprint-objs := print.o abc.o
else
    PWD = $(shell pwd)
    KVER = $(shell uname -r)
    KDIR = /lib/modules/$(KVER)/build
all:
    make -C $(KDIR) M=$(PWD)
clean:
    rm *.o *.ko modules.*
endif

--------------------------------------------------------------------------------
至此問題已完全解決。 不過也花費了我不少時間
結論:
obj-m(或-y)由模組名.o檔案連線生成。
模組名-objs(或-y)由指定.o 檔案連線而成
--------------------------------------------------------------------------------

相關推薦

原始檔編譯一個模組注意Makefile 書寫

多個原始檔編譯成一個模組,不正確的Makefile 會使printk 不能輸出資訊。 細細觀測,發現是對Makefile 語法未深刻理解所致。 下面附上一例說明問題。 -----------------------------------------------------

如何將PDF合併一個PDF?這樣的方法最簡單

  現在很多PDF文獻資料都是以多個檔案進行上傳,也就是一個完整的文件可能會被分成幾個部分,文章是被分成很多個這樣預覽起來會比較的麻煩,那我們如何將多個PDF合併成一個PDF格式呢?   下面看看迅捷轉換器(www.xunjiepdf.com)如何將多個PDF檔案合併成一個PDF。   軟體

mysql如何將一個欄位型別串一個字串?

結論 先說結論,可以使用group_concat group by的組合實現多行變一行,將一個欄位的多個型別串成一個欄位 需求: 如題,一個欄位如電影類別,一部電影可以是多個類別,如喜劇、動作片等,其形式可以是這樣的1::Toy Story (1995)::Animation

如何把pdf合併一個pdf

伴隨著工作的日積月累,電腦上零散的PDF檔案也越來越多,經常有一些同一型別的檔案分成好幾個PDF檔案,大家都想將相同的檔案整理成一份PDF檔案,這樣不僅不會丟失某一部分檔案,也方便檔案的查詢,那麼如何把多個PDF合併成一個PDF呢?小編將自己總結得來的方法和大家一起分享吧。1.想要把PDF檔案合併,大家先需要

java 怎麼把list 合併一個去掉重複的

轉自https://www.cnblogs.com/holyday/p/7685571.html public static void main(String[] args){ List<Integer> list1 = new ArrayList<Inte

用eclipse將jar打包一個jar

在開發java程式時,經常要用到第三方jar包。釋出java程式時,若帶著一大堆第三方jar包,既不方便,命令列也挺長,容易出錯。若是能將所有的第三方jar檔案連同程式執行檔案一併打包成一個jar,使用就會方便得多。經過摸索,可以使用eclipse完成此項功能。步驟如下:

.net中如何把檔案合併一個檔案

懶得再單獨寫一個,所以就加了超級詳細的註釋 前幾個判斷主要是合併sql檔案,什麼樣的sql對應的什麼樣的處理, 最後一個判斷是合併任何檔案 方法的兩個引數:第一個是開啟檔案路徑的集合,第二個引數檔案儲存路徑 private void FileMerge(strin

原始檔編譯--makefile

main.c 中引入one.h 和two.h兩個標頭檔案,one.c two.c 分別實現兩個標頭檔案中定義的函式 有兩種方式編譯執行該程式, 一:手動單獨編譯 gcc -c one.c g

java字串中空格替換一個空格

本人原創,轉載請註明出處! 本人QQ:530422429,歡迎大家指正、討論。 目的:字串中多個空格替換成一個空格 public class test { public static void main(String[] args) {String w= "";St

字串中連續空格合併一個空格

 public string UnitMoreSpan(string str)         {             string originStr = str;             string newStr = "";             string[

java 空字元替換一個 字串數字前新增空格

String name1 = "水果 青菜 大米 麵粉"; //因為空格的數量不同 所以不會好處理 下面的方法會簡單一點 // 引數1 是代表所有的空格 ,引數2 是代表你要替換成的字串 例子我是替換成了一個下劃線 String zz =

vs中檔案合併一個檔案顯示

主要是通過修改 .csproj 檔案來達到顯示合併的效果,看測試: 新建一個控制檯程式,然後新建2個類Class1和Class2【它們都是partial類,是不是partial無所謂,主要看你怎麼按業務分塊組合】。 然後記事本開啟.csproj檔案。將Class2的Com

git合併commit壓縮一個

原文地址:http://platinhom.github.io/2016/01/02/git-combine_commit/ 有時commit多了看著會不爽.所以想合併掉一些commit. 這裡是最簡單的情況, 一條線下來N個commit, 合併掉末端的(沒有branch出去的). 假設有a,b,c,d四個

63 Three.js 將網格合併一個網格

var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias:true}); renderer.setSize(window.innerWidth, wi

js 將物件合併一個物件 assign方法。ES6新特性有哪些

1.接下來介紹一下ES6在Object新加的方法  assign()  1.作用:將多個物件{}  合併成一個獨立物件。  2.使用方式: Obejct.assign(合併的物件,傳入合併中的物件....) let user = {name:'無敵人',age:19}

個數組合併一個物件合併一個

多個數組合併成一個 ver arrry=arr1.concat(arr2).concat(arr3).concat(arr4).concat(arr4) 兩個物件合併成一個。                 let para={name:'1'};            

linux 核心模組程式設計之編譯原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

ETL工具kettle怎麽將轉換集一個作業中

順序 tar size 作業 ext watermark mar proc 很多 在實際工作中,經常會出現很多個轉換,這樣管理成本會很高,那麽這時就可以采取一種方式將這些轉換集成到一個作業之中,可以看一個現成的例子,如圖我們在這一個作業中集成了四個轉換,有一點需要說明,就是

Codeblocks編譯原始檔

當我們同時編譯多個檔案時,一個是a.c,另一個是main.c。下面是a.c的內容#include<stdio.h> char a = 'A'; void msg() { printf("Hello\n"); }下面是main.c的內容#include

每天學習一算法系列(4) (輸入一個整形陣列,數組裡有正數也有負數,陣列中連續的一個整陣列一個子陣列,每個子陣列都有一個和)

題目: 輸入一個整形陣列,數組裡有正數也有負數,陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4,