麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

makefile不同的編譯器生成多個(gè)中間文件

2019-11-14 09:18:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

首先,假設(shè)這里有3個(gè)cpp文件,2個(gè)cu文件:

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

首先獲取相應(yīng)的文件名稱以及去掉后綴后的文件名:

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

然后將不同的代碼進(jìn)行編譯

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

上面的代碼就會(huì)自動(dòng)生成相應(yīng)的.o文件 同樣,對(duì)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是去掉路徑的前綴,一般結(jié)合pwd可以用來(lái)獲取目錄名,在后面加上.cu可以再去掉后綴#而makefile中的basename是用來(lái)去掉后綴的$(foreach src,$(SRC_CU),$(eval NAM_CU += $$(basename $(src)));)

然后將不同的代碼進(jìn)行編譯

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的前面,因?yàn)閎uild會(huì)依賴這兩項(xiàng)生成的中間文件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 $^

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

#注意,這里gen_cpp,gen_cu一定要先放在build的前面,因?yàn)閎uild會(huì)依賴這兩項(xiàng)生成的中間文件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 $@ $^

看似是正確的,實(shí)際上會(huì)報(bào)錯(cuò)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品在线免费播放 | 中国hd高清xxxxvideo | 色妞视频男女视频 | 激情小说激情图片激情电影 | 色诱亚洲精品久久久久久 | 久久蜜桃香蕉精品一区二区三区 | 国产精品美女久久久久久不卡 | 亚洲aⅴ在线观看 | 精品国产乱码久久久久久丨区2区 | 狠狠干网站 | 久久久一二三 | 国产精品一区二区三区在线播放 | 免费看搡女人无遮挡的视频 | 欧美成人一区二区视频 | 久久国产精品免费视频 | 性少妇videosexfreexxx片 | 成人男女啪啪免费观看网站四虎 | 久久成人亚洲 | 久久国产精品小视频 | 精品中文字幕久久久久四十五十骆 | 国产小视频一区 | 国产亚洲精品久久久久久久软件 | 国产一区二区三区网站 | 久久亚洲春色中文字幕久久 | 国产亚洲精品久久久闺蜜 | 蜜桃av网| 男人的天堂视频网站 | 日韩视频一二区 | 国产免费视频一区二区裸体 | 欧美极品欧美精品欧美视频 | 成人艳情一二三区 | 国产精品wwww | 黄色一级片毛片 | 毛片毛片 | 久久国产一级 | 激情亚洲一区二区 | 亚洲一级网站 | hd极品free性xxx一护士 | 亚洲精品午夜电影 | 亚洲精品在线观看网站 | 久久久成人精品视频 |