多資料夾下的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
使用多執行緒實現檔案的複製功能,並在控制檯顯示覆制的進度,進度以百分比表示。例如:把檔案A複製到E盤某資料夾下,在控制檯上顯示“檔案已複製10%”,“檔案已複製20%”……“檔案已複製100%”,“複製
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.i
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)可以在某種程度上