• 一步一步写一个简单通用的makefile(一)


    经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的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 如何编写。

  • 相关阅读:
    粒子系统(二):绘制精美几何图案
    图像识别:微信跳一跳机器人
    粒子系统(一):从零开始画一颗树
    Unity3D对弈游戏:狼吃羊游戏
    编程模拟自然(九):元胞自动机
    自动绘图AI:程序如何画出动漫美少女
    UWP简单示例(三):快速开发2D游戏引擎
    jsoup开发网页客户端3
    Android 自定义Dialog类,并在Activity中实现按钮监听。
    Jsoup开发网站客户端第二篇,图片轮播,ScrollView兼容ListView
  • 原文地址:https://www.cnblogs.com/biglucky/p/4034926.html
Copyright © 2020-2023  润新知