導航:首頁 > 編程系統 > linux編譯cmakefile

linux編譯cmakefile

發布時間:2023-03-17 12:17:14

『壹』 如何用GCC在linux下編譯C語言程序

在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器,假設我們有下面一個非常簡單的源程序(hello.c):


int main(int argc,char **argv)


{


printf("Hello Linux ");


}


要編譯這個程序,我們只要在命令行下執行:


gcc -o hello hello.c


gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了

『貳』 linux內核模塊編譯-通過Makefile重命名.ko文件名和模塊名

假設模塊的源文件為hello.c,源碼如下:

使用該文件編譯內核模塊。
正常情況下,Makefile文件內容如下:

執行 make 命令,生成hello.ko文件。
執行 sudo insmod hello.ko 命令,安裝該模塊。
執行 lsmod 命令,查看安裝的模塊。就會看到第一行的就是hello模塊。

但是,如果想自定義模塊名稱為 xmole ,而不是默認的 hello ,如何實現呢?方法如下:
在Makefile中重命名obj-m並將obj-m的依賴關系設置為原始模塊(hello)
修改後的Makefile文件內容如下:

將obj-m設置為 xmole .o,並使 xmole .o依賴於 hello .o.
執行 make 命令後,生成 xmole .ko, 而不是 hello .ko,
安裝命令: sudo insmod xmole.ko
查看命令: lsmod ,就會看到被安裝名為 xmole 的模塊。

『叄』 linux中用C語言編寫完模塊後怎麼編寫makefile文件

1、先寫Makefile編譯出***.ko文件
模板如下,保存到命名為Makefile文件里,放到你代碼專的同級目錄下
TARGET=my_proc.ko
LINUXDIR=/lib/moles/$(shell uname -r)/build
PWD=$(shell pwd)
obj-m :=
obj-m += my_proc.o

all: $(TARGET)
$(TARGET): $(OBJS)
make -C $(LINUXDIR) SUBDIRS=$(PWD) moles
clean:
rm -f moles.order Mole.symvers $(TARGET) *.mod.c *.o
rm -rf .tmp_versions .mod* Mole.markers
2、屬make
3、root許可權下用命令插入模塊
insmod my_proc.ko
4、可以用你寫的應用程序打開、操作模塊了
5、查看模塊命令
lsmod
cat /proc/moles
modinfo my_proc.ko
6、root下卸載模塊
rmmod

『肆』 [Linux]編寫一個簡單的C語言程序,編寫Makefile文件。

//calculate.h
#ifndef DEFCALCULATE_H
#define DEFCALCULATE_H
#include <string>
#include <map>
#include <iostream>
#include <cctype>
using namespace std;
// =========================================================================
// = 一些標志,如數字、+-*/()
enum Token_value
{
NAME,
NUMBER,
END,
PLUS='+',
MINUS='-',
MUL='*',
DIV='/',
PRINT=';',
ASSIGN='=',
LP='(',
RP=')'
};
//#############################################################################
//#############################################################################
double term(bool); //乘法
double prim(bool); //處理初等項
double error(const string&); //錯誤函數
Token_value get_token(); //輸入
double expr(bool get); //加和減
//#############################################################################
//#############################################################################
extern double number_value; //
extern string string_value; //
extern Token_value curr_tok; //當前操作標志
extern map<string,double> table;//
extern int no_of_errors; //
#endif

//winconsole.cpp
#include "calculate.h"
#include <sstream>
istream* input;
int main()
{
//switch(argc)
//{
//case 1:
input=&cin;
// break;
//case 2:
// input=new istringstream(argv[1]);
// break;
//default:
// error("too many arguments");
// return 1;
//}
table["pi"]=3.14159;
table["e"]=2.718182;
while (*input)
{
get_token();
if (curr_tok==END)
{
break;
}
if (curr_tok==PRINT)
{
continue;
}
cout<<expr(false)<<endl;
}
if (input!=&cin)
{
delete input;
}
return 0;
}
//error.cpp
#include "calculate.h"
int no_of_errors;
double error(const string& s)
{
no_of_errors++;
cerr<<"error:"<<s<<'\n';
return 1;
}
//expr.cpp
#include "calculate.h"
Token_value curr_tok=PRINT;
double expr(bool get)//加和減
{
double left=term(get);
for (;;)
{
switch(curr_tok)
{
case PLUS:
left+=term(true);
break;
case MINUS:
left-=term(true);
break;
default:
return left;
}
}
}
//get_token.cpp
#include "calculate.h"
extern Token_value curr_tok;
Token_value get_token()
{
char ch=0;
cin>>ch;
switch(ch)
{
case 0:
return curr_tok=END;
case ';':
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=Token_value(ch);
case '0':case '1':case '2':case '3':case '4':
case '5':case '6':case '7':case '8':case '9':
case '.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
default:
if (isalpha(ch))
{
cin.putback(ch);
cin>>string_value;
return curr_tok=NAME;
}
error("bad token");
return curr_tok=PRINT;
}
}
//prim.cpp
#include "calculate.h"
double number_value;
string string_value;
map<string,double> table;
double prim(bool get)
{
if (get)
{
get_token();
}
switch(curr_tok)
{
case NUMBER:
{
double v=number_value;
get_token();
return v;
}
case NAME:
{
double& v=table[string_value];
if (get_token()==ASSIGN)
{
v=expr(true);
}
return v;
}
case MINUS:
{
return -prim(true);
}
case LP:
{
double e=expr(true);
if (curr_tok!=RP)
{
return error(")expected");
}
get_token();
return e;
}
default:
return error("primary expected");
}
}
//term.cpp
#include "calculate.h"
double term(bool get)
{
double left=prim(get);
for (;;)
{
switch(curr_tok)
{
case MUL:
left*=prim(true);
break;
case DIV:
if (double d=prim(true))
{
left/=d;
break;
}
return error("divide by 0");
default:
return left;
}
}
}
//makefile
objects = error.o expr.o get_token.o prim.o term.o winconsole.o
calculate:$(objects)
g++ -Wall -g -o calculate $(objects)
$(objects) : %.o : %.cpp
g++ -c $(CXXFLAGS) $< -o $@

//這是一個在linux下實現的簡單的計算器程序,實現帶括弧的+-*/運算的,由於復制進來代碼格式有點出入,你自己把代碼格式規范下,尤其是makefile文件里的命令前面一定要以一個tab開始

『伍』 Linux中編寫了內核模塊的C源程序之後怎麼編寫makefile文件的內容

make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎麼樣的去編譯和鏈接程序。

首先,我們用一個示例來說明Makefile的書寫規則。以便給大家一個感興認識。這個示例來源於GNU的make使用手冊,在這個示例中,我們的工程有8個C文件,和3個頭文件,我們要寫一個Makefile來告訴make命令如何編譯和鏈接這幾個文件。我們的規則是:
1)如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。

只要我們的Makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

一、Makefile的規則

在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。

target ... : prerequisites ...
command
...
...

target也就是一個目標文件,可以是Object File,也可以是執行文件。還可以是一個標簽(Label),對於標簽這種特性,在後續的「偽目標」章節中會有敘述。

prerequisites就是,要生成那個target所需要的文件或是目標。

command也就是make需要執行的命令。(任意的Shell命令)


是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說
白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是
Makefile的規則。也就是Makefile中最核心的內容。

說到底,Makefile的東西就是這樣一點,好像我的這篇文檔也該結束了。呵呵。還不盡然,這是Makefile的主線和核心,但要寫好一個Makefile還不夠,我會以後面一點一點地結合我的工作經驗給你慢慢到來。內容還多著呢。:)

二、一個示例

正如前面所說的,如果一個工程有3個頭文件,和8個C文件,我們為了完成前面所述的那三個規則,我們的Makefile應該是下面的這個樣子的。

edit : main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o

main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o


斜杠(/)是換行符的意思。這樣比較便於Makefile的易讀。我們可以把這個內容保存在文件為「Makefile」或「makefile」的文件中,
然後在該目錄下直接輸入命令「make」就可以生成執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下「make
clean」就可以了。

在這個makefile中,目標文件(target)包含:執行文件edit和中間目標文件(*.o),依賴文件
(prerequisites)就是冒號後面的那些 .c 文件和 .h文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件
edit 的依賴文件。依賴關系的實質上就是說明了目標文件是由哪些文件生成的,換言之,目標文件是哪些文件更新的。

在定義好依賴關系
後,後續的那一行定義了如何生成目標文件的操作系統命令,一定要以一個Tab鍵作為開頭。記住,make並不管命令是怎麼工作的,他只管執行所定義的命
令。make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的
日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。

這里要說明一點的是,clean不是一個文件,它只不過
是一個動作名字,有點像C語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找文件的依賴性,也就不會自動執行其後所定義的命令。
要執行其後的命令,就要在make命令後明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在一個makefile中定義不用的編譯或是和編
譯無關的命令,比如程序的打包,程序的備份,等等。

『陸』 linux下編寫簡單的makefile的報錯

如果真的 簡單,就不用 makefile
一個命令行
gcc -o hello hello.c
gcc 編譯 hello.c 文件,目標 文件 hello

閱讀全文

與linux編譯cmakefile相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接