如何把2个exe和dll同时用一个makefile更新
不太懂makefile,只知道大致原理。对于dll的编译和链接
DLL = algs
EXE = test
ML_FLAG = /c /coff
LINK_FLAG = /subsystem:windows /Dll
LINK_FLAG1 = /subsystem:windows
####################################################
# 创建共享数据段的DLL时使用的连接选项
# LINK_FLAG = /subsystem:windows /Dll /section:.bss,S
####################################################
$(EXE).exe:$(EXE).obj $(DLL).DLL
Link $(LINK_FLAG1) $(EXE).obj
$(DLL).dll: $(DLL).obj $(DLL).def
Link $(LINK_FLAG) /Def:$(DLL).def $(DLL).obj
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
clean:
del *.obj
del *.exp
del *.lib
这个makefile可以用,但是我还想在同一个文件夹里面创建一个test.asm,编译成test.exe,其中test.asm调用dll里面的函数,我应该怎么修改这个makefile呢。
感谢回答,辛苦了,我仔细研究了下,之前主要是对文件的依赖关系和隐式规则不是很明白,手动输入就太慢了(之前都是放2个文件夹,更新dll之后粘过去,然后再来调试exe),现在终于弄好了,只是生成exe不用连接上dll。
EXE = test
DLL = algs
OBJS1 = $(EXE).obj
OBJS2 = $(DLL).obj
LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff
.NOPHY:all
all:$(EXE).exe $(DLL).dll
$(EXE).exe: $(OBJS1)
Link $(LINK_FLAG) $(OBJS1)
$(DLL).dll: $(OBJS2) $(DLL).def
Link $(LINK_FLAG) /Dll /Def:$(DLL).def $(OBJS2)
.asm.obj:
ml $(ML_FLAG) $<
clean:
del *.obj
del *.exp
再次感谢,追问那里写不下了就写这里来了,以前问题太多分早就为0了,无法加分,不好意思。
汇编makefile相关
答案:2 悬赏:70 手机版
解决时间 2021-03-13 06:41
- 提问者网友:情歌越听越心酸
- 2021-03-12 12:24
最佳答案
- 五星知识达人网友:几近狂妄
- 2021-03-12 12:41
你makefile 的风格有问题,不是很好。你这么写扩展性也不好。
我给你一个版本的。你写的很混乱我就用gcc 和 link做例子,命令你自己改吧。
只需要改动命令就行了。整个依赖结构就是我写的这样。
只要在all字段包含两个应用程序就行了,然后你只要分别写出两个应用的编译依赖就可以了。
——表示一个tab缩进。
------
LINK=Link
#连接器
GCC=gcc
#编译器
DLL=algs
DLL2=algs2
.NOPHY:all test ${DLL}.dll test2 ${DLL2}.dll
all:test test2
只要在all字段中同时包含test 和test2依赖就会自动更新了。
#=====test.exe
test:test.exe
test.exe:test.obj ${DLL}.dll
——${LINK} $^
——#链接dll和obj成可执行程序test.exe
test.obj:test.asm
——${GCC} -c $< -o $@
——#把test.asm编译成对象文件 test.obj
${DLL}:${DLL}.dll
${DLL}.dll:${DLL}.asm
——#dll.asm编译dll
——${GCC} --share $^ -o$@
#====test2.exe
test2:test2.exe
test2.exe:test2.obj ${DLL}.dll
——${LINK} $^
——#链接dll和obj成可执行程序test2.exe
test2.obj:test2.asm
——${GCC} -c $< -o $@
——#把test2.asm编译成对象文件 test2.obj
${DLL2}:${DLL2}.dll
${DLL2}.dll:${DLL2}.asm
——#dll.asm编译dll
——${GCC} --share $^ -o$@
我给你一个版本的。你写的很混乱我就用gcc 和 link做例子,命令你自己改吧。
只需要改动命令就行了。整个依赖结构就是我写的这样。
只要在all字段包含两个应用程序就行了,然后你只要分别写出两个应用的编译依赖就可以了。
——表示一个tab缩进。
------
LINK=Link
#连接器
GCC=gcc
#编译器
DLL=algs
DLL2=algs2
.NOPHY:all test ${DLL}.dll test2 ${DLL2}.dll
all:test test2
只要在all字段中同时包含test 和test2依赖就会自动更新了。
#=====test.exe
test:test.exe
test.exe:test.obj ${DLL}.dll
——${LINK} $^
——#链接dll和obj成可执行程序test.exe
test.obj:test.asm
——${GCC} -c $< -o $@
——#把test.asm编译成对象文件 test.obj
${DLL}:${DLL}.dll
${DLL}.dll:${DLL}.asm
——#dll.asm编译dll
——${GCC} --share $^ -o$@
#====test2.exe
test2:test2.exe
test2.exe:test2.obj ${DLL}.dll
——${LINK} $^
——#链接dll和obj成可执行程序test2.exe
test2.obj:test2.asm
——${GCC} -c $< -o $@
——#把test2.asm编译成对象文件 test2.obj
${DLL2}:${DLL2}.dll
${DLL2}.dll:${DLL2}.asm
——#dll.asm编译dll
——${GCC} --share $^ -o$@
全部回答
- 1楼网友:舊物识亽
- 2021-03-12 14:00
exe=1 表明变量 exe为1
objs=$(exe).obj 表明 变量objs=1.obj, $(exe)是上面那个变量,所以为1.obj
jk_link=/subsystem:windows定义的是 link的参数变量
jk_ml=/c /coff 定义的是 ml参数变量
$(exe):$(objs) 1依赖于1,obj,那个exe是变量名,而不是生成所代表文件的后缀,现在这个变量名exe为1
makefile格式,我就了解的很皮毛,如果有错,希望能谅解,呵呵
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯