makefile不同的代码进行不同的编译,比如cuda代码中想将cpp代码和cu代码分开分别编译成.o文件,再将.o文件编译成一个哭文件或者可执行文件,这时可能cpp和cuda的编译器不一样,那么就不能够使用自动推导,当然,也可以将两个编译器组合成一个编译器,让系统根据代码自己去选择相应的编译器,这里将的是如果想分开的话,应该怎么做?
首先,假设这里有3个cpp文件,2个cu文件:
a.cpp ,b.cpp,d.cpp
kernel1.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 build
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;)
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.so
target:$(gen_cpp) $(gen_cu)
$(ALL_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] -shared $^
还有一种更简单的模式规则可以使用,相比上面,下面代码的好处是,由于需要生成的目标是实际存在的,因此,如果编译时间较长时,上面这种方法由于是伪目标,每次都需要重新进行编译,会很耗时,而下面这种,只会编译更改后的源文件:
#注意,这里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 [email protected] $^
$(OBJ):%.o:%.cpp
$(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
target.so:$(OBJ_CU) $(OBJ)
$(ALL_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
注意如果将上面的
$(OBJ_CU):%.o:%.cu
$(NVCC_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
$(OBJ):%.o:%.cpp
$(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
更改成
$(OBJ_CU):$(SRC_CU)
$(NVCC_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
$(OBJ):$(SRC)
$(HOST_COMPLIER) $(INCLUDES) $(ALL_CCFLAGS) -o [email protected] $^
看似是正确的,实际上会报错
文章出处:http://blog.sina.com.cn/s/blog_68f262210102xdg6.html今天看到一篇文章,觉得讲的很好,分享出来然更多的人看到,此篇文章是17年写的,如今正是18年初,还未过年,与文章讲的是同一时间,感触颇深。。。转眼间2017已过了十天,中国传统的新年也马上来临。目前大家的状态应该是人在曹营心在汉,早想着回家过年的事情了吧?抢票,参加年会
**Android华为推送低版本兼容问题**ps:本篇只适合已集成完毕华为推送sdk的开发者,在兼容上遇到的问题。关于集成华为hms服务移动推送时遇到的问题:第三方:华为移动hms服务-推送服务需求:提高推送覆盖率处理方案:透传 + 自启动权限开放:自启动 = on根据官方文档集成后,在华为老机型上运行时出现了崩溃.//HuaweiApiAvailability.get...
APP 如何自动实现携带参数安装?这是许多开发者感兴趣的问题,毕竟在 APP 开发的许多逻辑上常常不可避免的需要判断安装来源,比如:广告投放、用户邀请、用户行为、社交分享等 APP 推广环节,国内的 openinstall 就是 APP 安装来源追踪领域的专业第三方服务商。下面我们就来详解 openinstall 的APP传参安装技术流程:1、首先开发者在分享的 H5 页面上集成 openi...
Faster RCNNFaster RCNN的结构1 Conv layers区域生成网络anchorssoftmax判定foreground 与 backgroundbounding box regression原理对proposal进行bounding box regressionproposal layerROI pooling为什么需要roi poolingROI pooling原理Clas...
JAVA实现实用的ZIP压缩与解压
在刚开始学习数据库时会遇到如何理解两层嵌套 not exists 实现全称量词的查询的理解。例如:Student : Sno (学号) Sname(姓名) Ssex(性别) Sage(年龄) Sdept(系)Course :Cno(课程号) Cname(课程名) Cpno(先行课) Ccredit(学分)SC :Sno(学号) Cno(课程号) Grade(成绩)查询选修了全部课程的学生姓名:Select SnameFrom StudentWhere no...
感谢与转载于:https://www.cnblogs.com/huolong-blog/p/6816071.html由于Windows系统的VMware出了一些问题,索性就不用VM了,直接装上双系统好了。但是在最后安装时出现错误提示“分配到/的分区/dev/sdc1开始于3584字节,使用磁盘的最小对齐,这可能造成非常差的性能...",点继续安装没反应,系统装不上,必须解决这个问题才行。...
物理与天文学 ФИЗИКА И АСТРОНОМИЯ分为以下专业:1-应用物理和数学2-数学与信息技术3-应用信息学4-大科学下的控制流程5-物理6-大型研究设施下的凝聚态物理学1-应用物理和数学授课语言:俄语和英语大学适应与学习专业交流英语大气电学科研数据库辐射与物质的相互作用电气材料工程导论气候理论导论现代统计光学的问题地球物理实践行星大气遥感专业交流西班牙语应用物理与应用数学的历史...
动态表单复杂的后端管理系统,逃不掉表单项的动态增减,结合 Antd 就会有这几个问题:怎么在已经写好的 Form 表单中,增添新的表单元素?怎么友好的添加新表单字段?甚至是一批字段?这些字段怎么纳入原先的 validate 校验体系?我参考官网的 动态增减表单项-示例 ,再“绞尽脑汁”准备了还算过得去的 demo。下面看下效果图,同时我会做简单的说明:如何动态添加元素?往页面上添加元素倒是不难,现...
相信遇到这个问题的朋友们的配置文件是这样写的:但是奇怪的是明明cmd的路径没错,但是这样配置后重启vscode还是依然启动不了cmd,然而细心的朋友把鼠标移到波浪线上的时候vscode会提示这个配置已经弃用了,所以如果你的vscode版本大于1.57的话就不行了。所以要改成这样配置:"terminal.integrated.profiles.windows": { "cmder": { "path": "C:\\Windows\\System32\\cmd.exe", "arg
一般建表时候,创建时间用datetime,更新时间用timestamp。这是非常重要的。我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个timestamp列会更新成当前时间,而第二人timestamp列的值不变。————————————————————————-MySQL5日期类型DATETIME和TIMESTAMP 相关问题详解...
郭靖在大漠练习了2年全真教的内容心法后,进入中原,面对杨康的时候,也就是皮糙肉厚而已,内功底子其实比较一般,比武大会就能卡得出来的。也就是说郭靖练习内功的根骨比较一般,无外乎就是一股硬气而已,大漠练就的胫骨,耐受性比较好一些,当时论内功,其实还不如练功马马虎虎的杨康了。不过好在的是,内功基础练习扎实了,循序渐进,没有留下暗疾。郭靖真正的内功练习速度起来后,是在喝了梁子生的蝮蛇后,这个蝮蛇中的气血能让人功力大增30年。即使郭靖没有当时打坐调息,大部分都浪费了,但是留存在身上各处的蝮蛇血