TRACE_COMPILE = @$(ECHO) "Compiling : " $<
时间: 2024-03-29 20:38:31 浏览: 16
这也是一段 Makefile 中的代码,用于在编译过程中编译源代码文件。具体来说,它会在执行 make 命令时,对每个源代码文件进行编译,并输出一条提示信息。其中,@ 表示不回显命令本身,只输出命令执行结果。$(ECHO) 是一个 Make 内置的命令,用于输出字符串。$< 表示当前依赖项中的第一个文件,也就是要编译的源代码文件。
相关问题
CC = gcc SUBDIRS = f1 \ f2 \ main \ obj OBJS = f1.o f2.o main.o BIN = myapp OBJS_DIR = obj BIN_DIR = bin export CC OBJS BIN OBJS_DIR BIN_DIR all : CHECK_DIR $(SUBDIRS) CHECK_DIR : mkdir -p $(BIN_DIR) $(SUBDIRS) : ECHO make -C $@ ECHO: @echo $(SUBDIRS) @echo begin compile CLEAN : @$(RM) $(OBJS_DIR)/*.o @rm -rf $(BIN_DIR)
这是一个 Makefile 文件,用于编译 C 代码。通过设置 CC 变量为 gcc,指定编译器为 gcc。SUBDIRS 变量定义了需要编译的子目录,OBJS 变量定义了需要编译的目标文件。BIN 变量定义了最终的可执行文件名,OBJS_DIR 和 BIN_DIR 分别指定了目标文件和可执行文件的输出目录。all 目标是默认目标,用于编译全部子目录中的代码。CHECK_DIR 目标用于检查目标文件和可执行文件的输出目录是否存在,如果不存在则创建。SUBDIRS 对应的规则通过递归调用 make 命令进入子目录进行编译。CLEAN 目标用于清理编译生成的目标文件和可执行文件。
CC = /home/openwrt/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc CFLAGS = -fPIC all: clean compile_lib compile_main clean: @echo "Cleaning old files" rm -rf *.o libnsm.a usrtest compile_lib: @echo "Compiling library files" $(CC) $(CFLAGS) -c *.c ar rcs libnsm.a *.o compile_main: @echo "Compiling main application" $(CC) -o usrtest usrtest.c libnsm.a静态库的使用 有问题么
这份Makefile理论上是可以正常编译静态库和可执行文件的,但是有一些细节需要注意。
1. 静态库文件名
在Makefile中,静态库文件名是指定为libnsm.a。如果静态库文件名不是以lib开头并以.a结尾,需要将compile_lib中的-ar rcs libnsm.a *.o-修改为-ar rcs <静态库文件名> *.o。
2. 静态库的链接顺序
在链接可执行文件时,静态库的链接顺序也很重要。一般来说,被依赖的静态库应该在依赖它的静态库的前面,因此应该将-l参数放在可执行文件名称的后面。例如:
```
$(CC) -o usrtest usrtest.c -L. -lnsm
```
这条命令将链接可执行文件usrtest,并在静态库文件libnsm.a所在的目录中查找静态库文件。
3. 多文件编译
如果需要编译多个源文件,应该将每个源文件都编译成目标文件,然后再将目标文件打包成静态库文件。例如:
```
$(CC) $(CFLAGS) -c foo.c
$(CC) $(CFLAGS) -c bar.c
ar rcs libnsm.a foo.o bar.o
```
这里编译了两个源文件foo.c和bar.c,并将它们编译成目标文件foo.o和bar.o。然后将这两个目标文件打包成静态库文件libnsm.a。
综上所述,可以将Makefile修改为以下内容:
```
CC = /home/openwrt/tools/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
CFLAGS = -fPIC
all: clean compile_lib compile_main
clean:
@echo "Cleaning old files"
rm -rf *.o libnsm.a usrtest
compile_lib:
@echo "Compiling library files"
$(CC) $(CFLAGS) -c *.c
ar rcs libnsm.a *.o
compile_main:
@echo "Compiling main application"
$(CC) -o usrtest usrtest.c -L. -lnsm
```
这份Makefile将编译所有.c源文件,并将它们打包成静态库文件libnsm.a。然后将可执行文件usrtest链接到静态库文件libnsm.a。