簡單的makefile


單一程序

准備一個hello.c

#include <stdio.h>
int main(void)
{
    printf("Hello World!\n");
}

gcc hello.c,執行文件名被自動設置成a.out,可用./a.out直接執行,因為這是編譯成功的可執行二進制程序

gcc -c hello.c產生目標文件hello.o
gcc -o hello hello.o利用目標文件制作一個名為hello的執行文件

主、子程序鏈接

准備一個主程序thanks.c,一個子程序thanks_2.c

//thanks.c
#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
    thanks_2();
}
//thanks_2.c
#include <stdio.h>
void thanks_2(void)
{
    printf("Thank you!\n");
}

進行編譯與鏈接
gcc -c thanks.c thanks_2.c制作出兩個.o文件
gcc -o thank thanks.o thanks_2.o產生thanks可執行程序

如果以后更新了thanks_2.c文件,只需要重新編譯來產生新的thanks_2.o,然后再鏈接制作出最后的程序即可,不用再編譯thanks.c

調用外部函數庫

//sin.c
#include <stdio.h>
#include <math.h>
int main(void)
{
    float value;
    value = sin (3.14 / 2);
    printf("%f\n", value);
}

數學函數庫使用的是libm.so這個函數庫,最好在編譯的時候將它包含進去
gcc sin.c -lm -L/lib -L/lib64
-l: 是加入某個函數庫的意思
m: 是libm.so這個函數庫
由於Linux默認將函數庫放置在lib和lib64中,所以不寫也沒關系

用make進行宏編譯

准備4個文件main.c, haha.c, sin_value.c, cos_value.c

//main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;

int main(void)
{
	printf ("\n\nPlease input your name: ");
	scanf  ("%s", &name );
	printf ("\nPlease enter the degree angle (ex> 90): " );
	scanf  ("%f", &angle );
	haha( name );
	sin_value( angle );
	cos_value( angle );
}
//haha.c
#include <stdio.h>
int haha(char name[15])
{
	printf ("\n\nHi, Dear %s, nice to meet you.", name);
}
//sin_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;

void sin_value(void)
{
	float value;
	value = sin ( angle / 180. * pi );
	printf ("\nThe Sin is: %5.2f\n",value);
}
//cos_value.c
#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;

void cos_value(void)
{
	float value;
	value = cos ( angle / 180. * pi );
	printf ("The Cos is: %5.2f\n",value);
}
正常的步驟
gcc -c main.c haha.c sin_value.c cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
./main

使用make
先准備一個makefile文件

$vim makefile
main: main.o haha.o sin_value.o cos_value.o
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
$make
$make 再一次

make比shell腳本好在:它能主動判斷哪一個源代碼有修改過,並僅更新該文件

makefile的基本語法和變量

target: target_file1 target_file2 ...
<tab> gcc -o exe_file_name target_file1 target_file2 ...
  • makefile中#代表注釋
  • <tab>需要在命令行的第一個字符
  • target與其依賴文件之間要用:分隔

如果想擁有兩個以上的操作時,可如此制作makefile文件

main: main.o haha.o sin_value.o cos_value.o
    gcc main main.o haha.o sin_value.o cos_value.o -lm
clean:
    rm -fv main main.o haha.o sin_value.o cos_value.o

test:
$make clean
$make main

再改進一下:

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
    gcc -o main ${OBJS} ${LIBS}
clean:
    rm -fv main ${OBJS}

變量的基本語法:

  • 變量與變量內容以=分隔,兩邊允許空格
  • 變量左邊不可以有tab, :
  • 變量應該大寫
  • 使用方式,以${變量}的形式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM