1. 程式人生 > >多資料夾下的Makefile自動編譯

多資料夾下的Makefile自動編譯

  很多時候我們可能會遇到這樣的情況:要編譯多個目錄下的程式碼,然後要將中間檔案和執行檔案分別放到不同的資料夾下面。好吧,貼圖的排版第一次用,將就看一下。下面的圖是我練習用的一個專案檔案結構圖。其中bin用來存放最後生成的可執行檔案,f1,f2分別是用到的兩個模組(函式),而且兩個資料夾下分別對應自己的Makefile編譯檔案,include包含的是標頭檔案,main.c包含的是主函式,其對應資料夾下也有一個Makefile檔案,而obj是用來存放中間檔案。然後是根目錄下有一個全域性的Makefile編譯檔案。

  我們通過在根目錄下,鍵入make,系統會自動到main,f1,f2資料夾下去編譯檔案,最後將生成的可執行檔案放到myapp下面。

  下面我從根目錄開始,重新回憶並記錄下實現的過程。首先看下根目錄下的Makefile。

#設定編譯器
CC=gcc

#參考資料http://www.cnblogs.com/Shirlies/p/4282182.html
#debug資料夾裡的makefile檔案需要最後執行,
#所以這裡需要執行的子目錄要排除debug資料夾,
#這裡使用awk排除了debug資料夾,讀取剩下的資料夾
#SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "cur_dir") print $$9}')

SUBDIRS=f1 \
		f2 \
		main \
		obj 
OBJS=f1.o f2.o main.o
#最終bin檔案的名字,可以更改為自己需要的
BIN=myapp
#bin檔案所在的目錄
BIN_DIR=bin
#目標檔案所在的目錄
OBJS_DIR=obj
#記住當前工程的根目錄路徑ROOT_DIR=$(shell pwd)
#獲取當前目錄下的c檔案集,放在變數CUR_SOURCE中CUR_SOURCE=${wildcard *.c}
#將對應的c檔名轉為o檔案後放在下面的CUR_OBJS變數中CUR_OBJS=${patsubst %.c, %.o, $(CUR_SOURCE)}

#將以下變數匯出到子shell中,本次相當於匯出到子目錄下的makefile中
export CC OBJS BIN OBJS_DIR BIN_DIR

#注意這裡的順序,需要先執行CHECK_DIR最後才能是SUBDIRS
all:CHECK_DIR $(SUBDIRS)

CHECK_DIR:
#mkdir -p 可以一次生成多級目錄
	mkdir -p $(BIN_DIR)
#遞迴執行子目錄下的makefile檔案,這是遞迴執行的關鍵
$(SUBDIRS):ECHO
	#直接去根目錄下的其他目錄下執行子makefile檔案
	make -C 
[email protected]
ECHO: #將c檔案編譯為o檔案,並放在指定放置目標檔案的目錄中即OBJS_DIR @echo $(SUBDIRS) @echo begin compile #將c檔案編譯為o檔案,並放在指定放置目標檔案的目錄中即OBJS_DIR #$(CUR_OBJS):%.o:%.c # $(CC) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/[email protected] clean: @$(RM) $(OBJS_DIR)/*.o @rm -rf $(BIN_DIR)
  f1資料夾下面的f1.c和Makefile分別如下:

  f1.c如下:

#include "../include/myinclude.h"


void print_f1()
{
	printf("Message from f1.c\n");
}
  Makefile如下:
../$(OBJS_DIR)/f1.o:f1.c
	$(CC) -c $^ -o [email protected] 

#OBJS=f1.o f2.o main.o
#[email protected]  表示規則中的目標檔案集。
#$^ 所有的依賴目標的集合
  f2資料夾下類似:

  f2.c如下:

#include "../include/myinclude.h"


void print_f2()
{
	printf("Message from f2.c\n");
}
  Makefile如下:
../$(OBJS_DIR)/f2.o:f2.c
	$(CC) -c $^ -o [email protected]

  include資料夾下面的標頭檔案include.h如下:
#ifndef _MY_INCLUDE_H_
#define _MY_INCLUDE_H_


#include <stdio.h>

#endif

  main資料夾下面的檔案.

  main.c如下:

#include <stdio.h>

int main()
{
	print_f1();
	print_f2();

	return 0;
}

 Makefile如下:
../$(OBJS_DIR)/main.o:main.c
	$(CC) -c $^ -o [email protected]

  感覺根據學過的一些shell命令,還是可以看懂整個流程,不過說實在的,要是真正讓我寫的話,我還是寫不出來,只能對照著例子來寫。不過我想這樣子的程式應該就夠了,畢竟用的時候是可以查詢資料的。模仿的功力還是得學的~~



相關推薦

資料Makefile自動編譯

  很多時候我們可能會遇到這樣的情況:要編譯多個目錄下的程式碼,然後要將中間檔案和執行檔案分別放到不同的資料夾下面。好吧,貼圖的排版第一次用,將就看一下。下面的圖是我練習用的一個專案檔案結構圖。其中bin用來存放最後生成的可執行檔案,f1,f2分別是用到的兩個模組(函式),

Linux資料編寫Makefile詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

MyEclipse編譯後,classes資料為空2. 3.刪除現在的專案,提前設定好編譯檔案輸出路徑,重新匯入原始檔,設定eclipse為儲存時編譯,然後在儲存的時候就可以自動編譯

問題總結: 1.重新匯入的專案結構與原來的不同 src包等等都和原來的不同,開啟專案主目錄,中有個.classpath檔案,用記事本開啟會發現有一行<classpathentry kind="src" path="src"/>,估計它的意思就是說你的原始檔位置,看看有沒有這一行,沒有一定要補上,下

matlab顯示資料副影象

  最近在寫深度學習演算法方案的時候,需要在方案書附錄中對imagenet資料集視覺化,但imagenet資料集中的影象大小並不完全相同,經過一番努力,顯示效果才達到導師的要求,故這裡把我實現過程中的小問題記錄下來,方便以後參考。   在寫機器學習方面的paper時,通常需要視覺化資料

MapReduce設定輸出檔案到資料

一:自定義OutputFormat類 MapReduce預設的OutPutFormat會將結果輸出檔案放置到一個我們指定的目錄下,但如果想把輸出檔案根據某個條件,把滿足不同條件的內容分別輸出到不同的目錄下,就需要自定義實現OutputFormat類,且重寫RecordWriter方法。 在驅

解決maven非resources資料的配置檔案編譯時不拷貝問題

用hibernate反向生成實體類時,報錯:org.hibernate.MappingNotFoundException: resource:**.hbm.xml not found 原因: maven web工程中,編譯時預設只將resources下的資原始檔拷貝到ta

windows環境使用jenkins自動部署釋出專案部署到tomcat webapps資料

1、首先在windows環境下安裝好jenkins(在此之前首先做到此專案是maven專案,並且已經可通過eclipse上傳和更新svn倉庫程式碼),在瀏覽器輸入localhost:8080/ (jenkins預設埠號是8080,tomcat有時也是這個,不要衝突) 看能否正

怎樣用matlab讀取一個資料個子資料中的個圖片檔案

maindir = 'E:\Temp Folder'; subdir = dir( maindir ); % 先確定子資料夾 for i = 1 : length( subdir ) if( isequal( subdir( i ).name, '.' )

java 遞迴呼叫自動讀取某資料所有檔案(遞迴呼叫)

import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; public cl

python 讀取資料個檔案

import os os.chdir("G:\head in python\hfpy_ch5_data") L=[] for files in os.walk("G:\head in python\hfpy_ch5_data"): for file i

合併一個資料個檔案內容的單行shell命令

轉載網址:http://www.shangxueba.com/jingyan/1898710.html 合併一個資料夾下多個檔案內容:    複製程式碼程式碼如下:    find -name "*.log" -exec 'cat' {} \; > test.txt

用VS新建層架構時引用第三方dll 時清理解決方案時,放bin資料的bll被清空問題

今天新建一個新的專案時,引用了多個第三方的dll,每次一清空解決方案重新生成,dll就被清空,導致專案報錯,整個解決方案的dll都沒生成,so 看起來很嚴重。後來搜了下,說第三方的dll檔案不能放bin 檔案中,新建一個資料夾用來存放dll,檔案。另外也注意下引

Makefile自動編譯目錄的所有.C檔案

自動編譯目錄下的所有.C檔案的Makefile指令碼CC=gcc CFLAGS_WARN = -Wall DEFINE = INCLUDE = -I. SOURCES = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SOUR

shell-scp分發資料所有檔案到臺伺服器

#!/usr/bin/expect -f #chmod 777 distribute_file.sh #把所有目的ip寫入ipfile.txt檔案,ipfile.txt檔案與distribute_fil

android studio在一個資料建立個module(libraray)

每次開發專案都會引入一些第三方支援庫,而在android studio下它們都是作為module的形式存在一個專案中,太多的話難免看起來很亂,所以萌生了把他們放在同一個資料夾下的想法,也就是

Android NDK編譯的程式依賴obj資料so

so引用方式不用PREBUILT的方式,就可以不依賴obj/local/.... #LOCAL_SHARED_LIBRARIES := *** LOCAL_LDFLAGS   := -pie -fPIE #LOCAL_LDFLAGS  += -Wl,--allow-shl

在res資料建立menu,但是R.java檔案不能自動生成資源id

想在標題欄上加入選單選項,於是在res資料夾下建立了menu資源,在menu資料夾下建立了second_menu.xml檔案,完成了佈局檔案的設定,也在活動中添加了 @Override public boolean onCreateOptionsMenu(

tomcat問題,jsp頁面無法編譯,web頁面一片空白,log顯示空指標,在tomacat的work資料沒有生成相應的Java檔案

主要是  3個錯誤:1.  !ENTRY org.eclipse.ui 4 0 2013-08-06 20:41:20.643 2.  !ENTRY org.eclipse.jst.jsp.core 4 4 2013-08-09 16:54:04.4903. !ENTRY

MyEclipse工作集,將個專案放到一個資料

MyEclipse工作集的使用 隨著工作時間的推移,會發現軟體裡面的專案越寫越多,就會出現所有的專案都列在一起,要是想開啟某個專案還得一個個找,專案少可能一下就能找到,但專案一多的話就要花些時間了。而工作集(java working sets)可以在某種程度上