ubuntumakefile編譯
① ubuntu下gcc編譯c語言文件makefile的問題
makefile看起來沒什麼大問題,你出現的問題是gcc沒找到
可以現在shell下面打一個gcc看看,或者gcc --version
確認下是否已經正確安裝gcc,且已經把gcc添加到了PATH裡面。
② ubuntu下用makefile生成的執行文件如何調試
在Windows下,只需要簡單的點擊以下make,rebuild即可。而在linux下,這樣的IDE環境並沒有提供,難道必須每一步都執行一遍嗎?比較ok的做法自然是能夠利用批處理腳本來進行操作了,這樣,只需要修改腳本中需要編譯的文件即可。在Linux下,提供了這么一個方便的工具,make。那麼接下來我們來利用make進行程序的組織編譯吧。
1. 編寫tool.h
1
2
3
4
5
6
#ifndef __TOOL_H
#define __TOOL_H
void printInteger(int number);
#endif // end of tool.h
2. 編寫tool.c
1
2
3
4
5
6
7
#include "tool.h"
#include "stdio.h"
void printInteger(int number)
{
printf("the number is:%d\n",number);
}
3. 編寫main.c
1
2
3
4
5
6
7
8
9
10
11
#include "tool.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
int number;
number=10;
printf("Context-Type:text/html\n\n");
printInteger(number);
return 0;
}
4. 編譯鏈接文件生成可執行文件main
方法1:
命令行中進行編譯
4.1.1 編譯main.c生成main.o
sudo cc -c main.c
4.1.2 編譯tool.c生成tool.o
sudo cc -c tool.c
4.1.3 鏈接main.o和tool.o生成main可執行文件
sudo cc -o main main.o tool.o
4.1.4 運行main
sudo ./main
方法2:
makefile進行編譯鏈接
4.2.1 編寫makefile文件(沒有後綴名)
#MakeFile
main: main.o tool.o
main.o: main.c tool.h
cc -c main.c
tool.o: tool.c tool.h
cc -c tool.c
.PHONY:clean
clean:
rm *.o main
4.2.2 運行make進行編譯鏈接
sudo make
4.2.3 運行main
sudo ./main
4.2.4 刪除所有.o文件並再次編譯
sudo make clean
sudo make
③ ubuntu11.10 makefile編譯卻說armv4l-unknown-linux-gcc:Command not found 還有個Error 127
沒有添加環境變數,找不到你的命令,因為linux命令倒是從/bin /sbin /usr/bin /usr/sbin 四個目錄搜索的,如果你安裝命令時不是在這幾個命令就只能找不到了,驚異export一下,或是修改.bashrc文件。
④ 怎麼在ubuntu在編輯makefile文件
當我們寫的程序文件比較少的時候,敲入gcc
/g++,當你在大型工程中,在一個個編譯文件的話,你可能就會很郁悶。linux有一個自帶的make命令,它讓你的工作省去了很大的力氣,但是你要學習如何編寫makefile文件。
makefile是一種特殊的文件格式,他將會幫你自動管理你的項目,很強大。
下面通過實例一步步講解如何使用makefile。下面的四段代碼。
[cpp] view
plainprint?
/////main.cpp
#include "functions.h"
int main()
{
print_hello();
cout << endl;
cout << "The factorial of 5 is " << factorial(5) << endl;
return 0;
}
///hello.cpp
#include "functions.h"
void print_hello()
{
cout << "Hello World!";
}
///factorial.cpp
#include "functions.h"
int factorial(int n)
{
if(n!=1)
{ return(n * factorial(n-1)); }
else return 1;
}
//functions.h
void
print_hello();
int factorial(int n);
/////main.cpp
#include "functions.h"
int main()
{
print_hello();
cout << endl;
cout << "The factorial of 5 is " << factorial(5) << endl;
return 0;
}
///hello.cpp
#include "functions.h"
void print_hello()
{
cout << "Hello World!";
}
///factorial.cpp
#include "functions.h"
int factorial(int n)
{
if(n!=1)
{ return(n * factorial(n-1)); }
else return 1;
}
//functions.h
void
print_hello();
int factorial(int n);
請將以上文件放到一個目錄下。
請注意: 我用的是g++進行編譯的,你也可以按照你自己的選擇來編譯程序
make的作用
如果你運行: make命令,
它將會自動的在你的目錄下尋找makefile文件,然後執行它,如果你幾個makefile文件,你可以指定某一個特定的makefile文件
使用如下命令:
make -f mymakefile
如果你想知道更多的make 用法,可以執行man make 命令
執行過程
編譯器將會編譯你的源文件,然後輸出目標文件
鏈接器執行目標文件然後創建一個可執行文件。
手動編譯
最不理想的一種執行方式就是
g++ main.cpp hello.cpp factorial.cpp -o hello
akefile 基本規則
makefile的基本規則是有以下構成:
target: dependencies
[tab] system command
利用以上語法編寫如下
all:
g++main.cpp hello.cpp factorial.cpp -o hello
然後運行你的makefile,如下
make -f Makefile-1
如上代碼敘述,所寫的目標是all,all是makefile默認的目標,如果沒有其他規定,make語法將要執行這個目標文件。
我們還發現,all 目標並沒有依賴的,所以按照命令讓他安全的執行。
最後,make 通過 我們給的命令進行編譯程序
使用依賴
這是因為,如果你修改一個單獨的文件在你的項目,你不必重新編譯一切,只有你修改。 請看下邊的例子
[plain] view
plainprint?
all: hello
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
clean:
rm -rf *o hello
all: hello
hello: main.o factorial.o hello.o
g++ main.o factorial.o hello.o -o hello
main.o: main.cpp
g++ -c main.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
hello.o: hello.cpp
g++ -c hello.cpp
clean:
rm -rf *o hello
我們看到目標all
只有依賴,沒有系統命令。為了去執行正確,它必須滿足所有的目標所依賴的。目標都回去搜索所有的依賴,然後去執行它。
在例子中,我們看到了clean的目標,clean 這個目標就是清楚中間生成的.o文件和那些可執行文件
使用變數和注釋
當你寫makefil文件的時候,當你想改變一些編譯的一些選項的時候,他是非常有用處的。
[plain] view
plainprint?
# 這是注釋,CC 編譯器.
CC=g++
# CFLAGS 是選項
CFLAGS=-c -Wall
# 目標文件
OBJECTS=main.o factorial.o hello.o
all: hello
hello: $(OBJECTS)
$(CC) main.o factorial.o hello.o -o hello
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp
factorial.o: factorial.cpp
$(CC) $(CFLAGS) factorial.cpp
hello.o: hello.cpp
$(CC) $(CFLAGS) hello.cpp
clean:
rm -rf *o hello
# 這是注釋,CC 編譯器.
CC=g++
# CFLAGS 是選項
CFLAGS=-c -Wall
# 目標文件
OBJECTS=main.o factorial.o hello.o
all: hello
hello: $(OBJECTS)
$(CC) main.o factorial.o hello.o -o hello
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp
factorial.o: factorial.cpp
$(CC) $(CFLAGS) factorial.cpp
hello.o: hello.cpp
$(CC) $(CFLAGS) hello.cpp
clean:
rm -rf *o hello
你可以看到,使用這些有時候是非常有用的。你可以使用它們,賦值,當你想改變一些變數值的時候,然後你可以使用$(var),
來應用這些變數
如何繼續下去
通過以上簡要的介紹,你就可以簡要的去編寫一些更加復雜的makefile來運行你的復雜的程序了。上邊講的只是冰山一角
,你可以通過差一些make的文檔來寫。
[plain] view
plainprint?
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) {1}lt; -o $@
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) {1}lt; -o $@
通過以上簡要的介紹,你就可以簡要的去編寫一些更加復雜的makefile來運行你的復雜的程序了。上邊講的只是冰山一角
,你可以通過差一些make的文檔來寫。
⑤ ubuntu 中makefile 是什麼
1. 配置系統的基本結構Linux內核的配置系統由三個部分組成,分別是:
1. Makefile:分布在 Linux 內核源代碼中的 Makefile,定義 Linux 內核的編譯規則;
2. 配置文件(config.in):給用戶提供配置選擇的功能;
3. 配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基於字元界面、基於 Ncurses 圖形界面以及基於 Xwindows
圖形界面的用戶配置界面,各自對應於 Make config、Make menuconfig 和 make xconfig)。
這些配置工具都是使用腳本語言,如 Tcl/TK、Perl 編寫的(也包含一些用 C 編寫的代碼)。本文並不是對配置系統本身進行分析,而是介紹如何使用配置系統。所以,除非是配置系統的維護者,一般的內核開發者無須了解它們的原理,只需要知道如何編寫
Makefile 和配置文件就可以。所以,在本文中,我們只對 Makefile 和配置文件進行討論。另外,凡是涉及到與具體 CPU 體系結構相關的內容,我們都以
ARM 為例,這樣不僅可以將討論的問題明確化,而且對內容本身不產生影響。
2. Makefile
2.1 Makefile 概述Makefile
的作用是根據配置的情況,構造出需要編譯的源文件列表,然後分別編譯,並把目標代碼鏈接到一起,最終形成 Linux 內核二進制文件。
由於 Linux 內核源代碼是按照樹形結構組織的,所以 Makefile 也被分布在目錄樹中。Linux 內核中的 Makefile 以及與 Makefile 直接相關的文件有:
1. Makefile:頂層 Makefile,是整個內核配置、編譯的總體控制文件。
2. .config:內核配置文件,包含由用戶選擇的配置選項,用來存放內核配置後的結果(如 make config)。
3. archMakefile 還作了擴充。
⑥ 在Ubuntu中用rosmake編譯沒有可執行文件生成是怎麼回事
提示:make:沒有什麼可以做的為`first'。這個是Makefile的一個提示,出現這個提示是因為你編譯出來的可執行文件的時間戳比你的源代碼文件的時間戳「遲」,所以make認為你這種情況下沒必要編譯,因為即使編譯了,編出來的東西和現有的可執行文件一樣,就是浪費時間了,所以提示沒有什麼可以做的為`first'。如果你還要編,隨便打開源代碼的一個文件,保存下,就可以編譯了
⑦ 如何使用ubuntu來編譯驅動
工具/原料
Ubuntu12.04操作系統和測試驅動程序(beep_arv.c)
方法/步驟
在介紹2種方法前,必須知道的知識點:
1.關聯文件Makefile:
Makefile:分布在Linux內核源代碼中的Makefile用於定義Linux內核的編譯規則;
2.管理文件Kconfig:
給用戶提供配置選擇的功能;
配置工具:
1)包括配置命令解析器;
2)配置用戶界面;menuconfig || xconfig;
3)通過腳本語言編寫的;
3.
---tristate 代表三種狀態:1.[ ]不選擇,2.[*]選擇直接編譯進內核,載入驅動到內核里,3.[m]動態載入驅動;
---bool 代表兩種狀態,1.[ ]不選擇,2.[*]選擇;
---"Mini2440 mole sample"這個是在make menuconfig時刷出的提示字元;
---depends on MACH_MINI2440 這個配置選項出現在make menuconfig菜單欄下,在內核配置中必須選中、MACH_MINI2440;
---default m if MACH_MINI2440 這個如果選中了MACH_MINI2440,默認是手
動載入這個驅動;
help:提示幫助信息;
在了解了基本的知識點,便開始進行第一種添加驅動的方法,本次交流是以beep_arv.c蜂鳴驅動程序為基礎的
方法一:
1)進入內核的驅動目錄;
#cp beep_arv.c /XXX/.../linux-XXXl/drivers/char
2)進入Kconfig添加驅動信息;
#cd /XXX/linux-XXX/.../drivers/char
#vim Kconfig
添加基本信息:
config BEEP_MINI2440
tristate "---HAH--- BEEP"
default
help
this is test makefile!
3)進入Makefile添加驅動編譯信息;
#vim Makefile
添加基本信息:
obj-$(CONFIG-BEEP_MINI2440) +=beep_drv.o
方法一結果:
在--Character devices下就能看到配置信息了;
方法二:
1)進入驅動目錄,創建BEED目錄;
#cd /XXX/.../linux-XXX/drivers/char
#mkdir beep
2)將beep_arv.c驅動程序復制到新建目錄下;
#cp beep_arv.c /XXX/.../linux-XXXl/drivers/char/beep
3)創建Makefile和Kconfig文件
#cd char/beep
#mkdir Makefile Kconfig
#chmod 755 Makefile
#chmod 755 Kconfig
4)進入Kconfig添加驅動信息;
#vim Kconfig
添加基本信息:
config BEEP_MINI2440
tristate "---HAH--- BEEP"
default
help
this is test makefile!
5)進入Makefile添加驅動編譯信息;
#vim Makefile
添加基本信息:
obj-$(CONFIG_BEEP_MINI2440) +=beep_drv.o
6)並且要到上一級目錄的Makefile和Kconfig添加驅動信息;
#cd ../
#vim Makefile
#vim Kconfig
⑧ 用Ubuntu系統編譯時,出現以下問題:make: Makefile.dist: 沒有那個文件或目錄 請問是什麼原因
如下這個例子(3個子目錄, 一個Makefile), 子目錄的編譯順序由這個Makefile控制. sub_a sub_b sub_c Makefile
⑨ 如何在ubuntu下用makefile開發stm32
在Ubuntu下尋找Nucleo的串口號。
安裝常用的串口軟體。minicom,putty。
安裝st-link在Ubuntu下的驅動程序。包括下載用的st-flash,調試用的st-util。
安裝arm-none-eabi-xxx。
使用Makefile進行簡單的工程管理。
固件庫准備
編寫Makefile
編寫main函數。
編譯,鏈接,下載
未優化(6372Bytes)
-Os優化(3780Bytes)
-ffunction-sections,-fdata-sections,-Wl,--gc-sections優化(1680Bytes)
-ffunction-sections,-fdata-sections,-Wl,--gc-sections,-Os優化(1348Bytes)
反匯編代碼
分析flash.ld鏈接文件
修改flash.ld,將代碼區域更改到RAM中
修改Makefile,生成SRAM中運行的代碼。
下載,反匯編驗證。
隱含的巨大bug。(中斷向量表的問題)
ringbuffer
在中斷中使用ringbuffer
使用gdb調試
添加volatile修正代碼
修正ringbuffer的無鎖實現。
隱含的bug。