经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的GCC 命令,有的时候移植一些项目中的部分代码到小程序里面进行测试,这个时候GCC 命令并不好些,如果写啦一个比较常用的makefile的模板,然后把文件添加进来,简单的修改一下makefile即可以完成测试任务何乐而不为。
源代码有三个文件,三个文件在同一个目录下面/hellomake
hellomake .c:
#include "hellofunc.h" #include<stdio.h> #include<math.h> int main() { // call a function in another file myPrintHelloMake(); double value =15; printf("Value:%f ",log(value)); return(0); }
hellofunc.c:
#include "hellofunc.h" #include<stdio.h> void myPrintHelloMake(void) { printf("Hello makefiles! "); return; }
hellofunc.h
/* example include file */ void myPrintHelloMake(void);
编译,执行gcc 命令如下:
gcc -Wall -o hellomake hellomake.c hellofunc.c -lm
编译生成可执行文件hellomake.
执行命令:"./hellomake",结果如下:
Hello makefiles! Value:2.708050
gcc 的命令执行顺序应该编译源文件生成目标文件,然后链接目标文件生成可执行文件,执行命令如下:
gcc -Wall -c hellomake.c hellofunc.c
gcc -o hellomake hellomake.o hellofunc.o -lm
gcc -Wall -o hellofunc.o hellofunc.c
gcc -Wall -o hellomake.o hellomake.c
在当前目录下添加makefile文件:
#Hellomake #Magnum, 2014-10-19 # 指令编译器和选项 CC=gcc CFLAGS=-Wall LIBS=-lm # 目标文件 TARGET=hellomake SRCS = hellofunc.c hellomake.c # 依赖目标 OBJS =$(SRCS:.c=.o) $(TARGET):$(OBJS) #@echo TARGET:$(OBJS) # @echo OBJECTS:$^ $(CC) -o $@ $^ $(LIBS) clean: rm -rf $(TARGET) $(OBJS) $(OBJS):$(SRCS) $(CC) $(CFLAGS) -o $@ -c $<
执行make,报错:
gcc -Wall -o hellofunc.o -c hellofunc.c gcc -Wall -o hellomake.o -c hellofunc.c gcc -o hellomake hellofunc.o hellomake.o -lm hellomake.o: In function `myPrintHelloMake': hellofunc.c:(.text+0x0): multiple definition of `myPrintHelloMake' hellofunc.o:hellofunc.c:(.text+0x0): first defined here /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 10 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 19 /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start': (.text+0x20): undefined reference to `main' collect2: ld returned 1 exit status make: *** [hellomake] Error 1
错自第二句:
gcc -Wall -o hellomake.o -c hellofunc.c
使用$(OBJS):$(SRCS)并不会自动推进,修改makefile文件:
#Hellomake #Magnum, 2014-10-19 # 指令编译器和选项 CC=gcc CFLAGS=-Wall LIBS=-lm # 目标文件 TARGET=hellomake SRCS = hellofunc.c hellomake.c # 依赖目标 OBJS =$(SRCS:.c=.o) $(TARGET):$(OBJS) # @echo TARGET:$(OBJS) # @echo OBJECTS:$^ $(CC) -o $@ $^ $(LIBS) #$@指目标文件,这里是hellomake,$^指所有依赖文件,这里指hellofunc.o,hellomake.o clean: rm -rf $(TARGET) $(OBJS) %.o:%.c $(CC) $(CFLAGS) -o $@ -c $< #$<指第一个依赖文件此处以此为hellofunc.c,hellomake.c
执行make,编译OK。
如果有更多的源文件,一个个加很麻烦,可以用wildcard 来解决这个问题,进一步版本的makefile如下:
#Hellomake #Magnum, 2014-10-19 # 指令编译器和选项 CC=gcc CFLAGS=-Wall LIBS=-lm # 目标文件 TARGET=hellomake SRCS = $(wildcard *.c) #当前文件夹下面的所有.c文件 #SRCS = hellofunc.c # hellomake.c # 依赖目标 OBJS =$(SRCS:.c=.o) # $(TARGET):$(OBJS) # @echo TARGET:$(OBJS) # @echo OBJECTS:$^ $(CC) -o $@ $^ $(LIBS) #$@指目标文件,这里是hellomake,$^指所有依赖文件,这里指hellofunc.o,hellomake.o clean: rm -rf $(TARGET) $(OBJS) %.o:%.c $(CC) $(CFLAGS) -o $@ -c $< #$<指第一个依赖文件此处以此为hellofunc.c,hellomake.c
这里到这结束,下一篇是跨多个文件夹的makefile 如何编写。