国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

makefile不同的編譯器生成多個中間文件

2019-11-14 09:31:07
字體:
來源:轉載
供稿:網友

makefile不同的代碼進行不同的編譯,比如cuda代碼中想將cpp代碼和cu代碼分開分別編譯成.o文件,再將.o文件編譯成一個哭文件或者可執(zhí)行文件,這時可能cpp和cuda的編譯器不一樣,那么就不能夠使用自動推導,當然,也可以將兩個編譯器組合成一個編譯器,讓系統(tǒng)根據(jù)代碼自己去選擇相應的編譯器,這里將的是如果想分開的話,應該怎么做?

首先,假設這里有3個cpp文件,2個cu文件:

a.cpp ,b.cpp,d.cppkernel1.cu,kernel2.cu

首先獲取相應的文件名稱以及去掉后綴后的文件名:

SRC :=$(wildcard *.cpp)OBJ :=$(SRC:%.cpp=%.o)NAM :=$(foreach src,$(SRC),$(eval NAM += $$(shell basename $(src) .cpp));)

然后將不同的代碼進行編譯

gen_cpp: $(foreach n, $(NAM), $(EXEC) $(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o ${n}.o -c $(n).cpp;)

上面的代碼就會自動生成相應的.o文件 同樣,對cu代碼:

SRC_CU :=$(wildcard *.cu)OBJ_CU :=$(SRC_CU:%.cu=%.o)NAM_CU :=$(foreach src,$(SRC_CU),$(eval NAM_CU += $$(shell basename $(src) .cu));)#下面這句和上面這句一樣,不同的是,使用的是makefile自己的basename變量:#shell的basename是去掉路徑的前綴,一般結合pwd可以用來獲取目錄名,在后面加上.cu可以再去掉后綴#而makefile中的basename是用來去掉后綴的$(foreach src,$(SRC_CU),$(eval NAM_CU += $$(basename $(src)));)

然后將不同的代碼進行編譯

gen_cu: $(foreach n, $(NAM_CU), $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) -o ${n}.o -c $(n).cu;)

最后,完整的代碼:

.PHONY : gen_cpp gen_cu#注意,這里gen_cpp,gen_cu一定要先放在build的前面,因為build會依賴這兩項生成的中間文件all: gen_cpp gen_cu buildSRC :=$(wildcard *.cpp)OBJ :=$(SRC:%.cpp=%.o)NAM :=$(foreach src,$(SRC),$(eval NAM += $$(shell basename $(src) .cpp));)gen_cpp: $(foreach n, $(NAM), $(EXEC) $(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o ${n}.o -c $(n).cpp;)SRC_CU :=$(wildcard *.cu)OBJ_CU :=$(SRC_CU:%.cu=%.o)NAM_CU :=$(foreach src,$(SRC_CU),$(eval NAM_CU += $$(shell basename $(src) .cu));)gen_cu: $(foreach n, $(NAM_CU), $(NVCC) $(INCLUDES) $(ALL_CCFLAGS) -o ${n}.o -c $(n).cu;)build : target.sotarget:$(gen_cpp) $(gen_cu) $(ALL_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ -shared $^

還有一種更簡單的模式規(guī)則可以使用,相比上面,下面代碼的好處是,由于需要生成的目標是實際存在的,因此,如果編譯時間較長時,上面這種方法由于是偽目標,每次都需要重新進行編譯,會很耗時,而下面這種,只會編譯更改后的源文件:

#注意,這里gen_cpp,gen_cu一定要先放在build的前面,因為build會依賴這兩項生成的中間文件SRC :=$(wildcard *.cpp)OBJ :=$(SRC:%.cpp=%.o)SRC_CU :=$(wildcard *.cu)OBJ_CU :=$(SRC_CU:%.cu=%.o)all: $(OBJ_CU) $(OBJ) target.so$(OBJ_CU):%.o:%.cu $(NVCC_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^$(OBJ):%.o:%.cpp $(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^target.so:$(OBJ_CU) $(OBJ) $(ALL_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^

注意如果將上面的

$(OBJ_CU):%.o:%.cu $(NVCC_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^$(OBJ):%.o:%.cpp $(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^

更改成

$(OBJ_CU):$(SRC_CU) $(NVCC_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^$(OBJ):$(SRC) $(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o $@ $^

看似是正確的,實際上會報錯


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 孟连| 贡觉县| 白水县| 墨玉县| 京山县| 马鞍山市| 临桂县| 正阳县| 崇礼县| 沂水县| 南华县| 辛集市| 沈阳市| 友谊县| 崇阳县| 许昌市| 宁海县| 榆树市| 迁安市| 德江县| 东平县| 张北县| 石棉县| 虎林市| 谷城县| 宁城县| 抚州市| 织金县| 桂阳县| 会宁县| 丽水市| 巴林右旗| 法库县| 神木县| 镇坪县| 化州市| 军事| 稷山县| 云浮市| 麟游县| 宁蒗|