makefile文件中的这句代表什么意思?

时间:2022-04-05 22:56:08

OBJS = ${ASMS:.S=.o} ${SRCS:.c=.o}
其中
ASMS=
SRCS定义为一个.c文件
我看到makefile文件中没有任何gcc的编译命令如何生成 .o文件呢

8 个解决方案

#1


是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

#2


引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

#3


在你使用Gcc编译的时候,这些语句就起作用了,支持下1L

#4


引用 2 楼 tugouxp 的回复:
引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

因为这是makefile的隐含规则
在所有的规则中,并没有这.o目标文件的生成规则,因此使用默认的目标%.o:%c中的规则生成。
当然你可以制定自己的规则,比如:
  %.o: %.c
  $(CC) -c $(CFLAGS) $< -o $@

#5


引用 2 楼 tugouxp 的回复:
引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

不可能没有gcc或g++的,或许不在你这个makefile文件中,你的文件肯定包含(include)了其它的makefile

#6


引用 4 楼 tomsheep 的回复:
引用 2 楼 tugouxp 的回复:

引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

因为这是makefile的隐含规则
在所有的规……

语句中的$(CC) -c $(CFLAGS) $< -o $@时什么意思?跟我的有些类似。

#7


$(CC) -c $(CFLAGS) $< -o $@
$(CC)一般就是根据后缀名定义的编译器比如:
.cpp的把CC定义为g++
.c 的把CC定义为gcc
....


$(CFLAGS) 
定义的编译选项,这个需要了解g++ 的参数去;
$< -o $@
这讲起来就比较复杂了。。。

#8


引用 6 楼 tugouxp 的回复:
语句中的$(CC) -c $(CFLAGS) $< -o $@时什么意思?跟我的有些类似。


CC是自己定义的编译器,比如CC = gcc
-c 是gcc 的编译选项, 表示编译为.o文件
CFLAGS是编译参数 比如可以自定义CFLAGS = -O2 -Wall
$< 代表本条规则A:B的B部分(本例%.o:%.c中就是后缀为.c的文件的一个匹配)
-o是gcc编译选项,后跟输出文件名,
$@就是A部分,本例就是"文件名.o"

LZ可以照本oreilly出版社的Managing Projects with GNU Make,备做工具书
需要的时候翻看

#1


是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

#2


引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

#3


在你使用Gcc编译的时候,这些语句就起作用了,支持下1L

#4


引用 2 楼 tugouxp 的回复:
引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

因为这是makefile的隐含规则
在所有的规则中,并没有这.o目标文件的生成规则,因此使用默认的目标%.o:%c中的规则生成。
当然你可以制定自己的规则,比如:
  %.o: %.c
  $(CC) -c $(CFLAGS) $< -o $@

#5


引用 2 楼 tugouxp 的回复:
引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

不可能没有gcc或g++的,或许不在你这个makefile文件中,你的文件肯定包含(include)了其它的makefile

#6


引用 4 楼 tomsheep 的回复:
引用 2 楼 tugouxp 的回复:

引用 1 楼 lianshaohua 的回复:
是把.S后缀改为.o后缀,然后放到OBJS变量中;
把.c后缀改为.o后缀,然后放到OBJS变量中;
:::

根据你所输入的源文件名进行替换,从而编译成相应文件名的.o文件,

但是没有编译指令gcc等,却能编译出.o文件,怎么理解?

因为这是makefile的隐含规则
在所有的规……

语句中的$(CC) -c $(CFLAGS) $< -o $@时什么意思?跟我的有些类似。

#7


$(CC) -c $(CFLAGS) $< -o $@
$(CC)一般就是根据后缀名定义的编译器比如:
.cpp的把CC定义为g++
.c 的把CC定义为gcc
....


$(CFLAGS) 
定义的编译选项,这个需要了解g++ 的参数去;
$< -o $@
这讲起来就比较复杂了。。。

#8


引用 6 楼 tugouxp 的回复:
语句中的$(CC) -c $(CFLAGS) $< -o $@时什么意思?跟我的有些类似。


CC是自己定义的编译器,比如CC = gcc
-c 是gcc 的编译选项, 表示编译为.o文件
CFLAGS是编译参数 比如可以自定义CFLAGS = -O2 -Wall
$< 代表本条规则A:B的B部分(本例%.o:%.c中就是后缀为.c的文件的一个匹配)
-o是gcc编译选项,后跟输出文件名,
$@就是A部分,本例就是"文件名.o"

LZ可以照本oreilly出版社的Managing Projects with GNU Make,备做工具书
需要的时候翻看