Linux下多檔案的編譯(2)

2021-09-30 14:39:59 字數 1824 閱讀 2558

< myhello.c >:

#include 

#include "test.h"

#include "abc.h"

void print(void);

int main()

void print(void)

< abc.c >:

#include "abc.h"  

void abc(void)

< abc.h >:

#include 

void abc(void);

< test.c >:

#include 

void printtest(void)

< test.h >:

#include 

void printtest(void);

簡單來說,在myhello.c的main中,需要呼叫./abc.c的abc函式和./test.c的printtest函式,因而包含了他們的標頭檔案abc.h  test.h

重點來了,makefile可以怎麼寫(只是我的寫法的參考)

#目標(要生成的檔名)  

target := myhello

#編譯器的選擇(在linux中其實可以忽略,因為cc指向的本來就是gcc)

cc := gcc

#編譯的引數

cflag := -wall

#編譯包含的標頭檔案所在目錄

includes := -i. -iinclude/

srcs = myhello.c ./common/abc.c test.c

#把原始檔srcs字串的字尾.c改為.o

objs = $(srcs:.c=.o)

#匹配所有的偽目標依賴,即執行目標myhello.o & ./common/abc.c & ./common/test/test.c

.phony:all

#all為偽目標

all:$(objs)

#當所有依賴目標都存在後,鏈結,即鏈結myhello.o & ./common/abc.c & ./commontest/test.c

$(cc) $(ldflag) -o $(target) $^

#重定義隱藏規則,匹配上述目標:myhello.o & ./common/abc.c & ./common/test/test.c

%.o:%.c

#生成.o檔案,注意,由於srcs有個別包含詳細位址的,生成的.o檔案也是詳細位址

$(cc) -c $(includes) $(cflag) $(cppflag) $< -o $@

//清空除原始檔外的所有生成檔案

clean:

rm -rf $(basename $(target)) $(srcs:.c=.o)

結論:

在gcc時,會自動解決標頭檔案.h的依賴關係,只需要指明標頭檔案的位址

在gcc鏈結時,才需要把所有的原始檔.o列出了,否則出現引用了未定義的變數/函式

Linux 下Fortran多檔案編譯

或者ifort o exe name main.f90 fun.f90 方法二 在主程式main.f90 中加入include fun.f90 語句,然後在linux下用fortran命令編譯,命令如下 ifort o exe name main.f90 方法三 分步驟編譯,命令如下 ifort c...

Linux下Fortran多檔案編譯

或者ifort o exe name main.f90 fun.f90 方法二 在主程式main.f90中加入include fun.f90 語句,然後在linux下用fortran命令編譯,命令如下 ifort o exe name main.f90 方法三 分步驟編譯,命令如下 ifort c ...

Linux下C多檔案編譯Makefile

第一 makefile檔案編寫 1.第乙個字母大寫,其餘的都是小寫。2.makefile關係到了整個工程的編譯。3.可以執行作業系統的命令。4.其實makefile的本質是定義了檔案之間的依賴性問題。5.第乙個字母大寫,其餘的都是小寫。make命令執行時,需要乙個 makefile 檔案,以告訴ma...