簡體   English   中英

C:使用Makefile創建靜態庫和鏈接

[英]C: Creating static library and linking using a Makefile

我試圖了解靜態和共享庫

我想要執行以下操作來創建一個makefile,它將單獨的編譯和鏈接分開,以便在形成最終的靜態可執行文件時創建和鏈接靜態庫。

我有Makefile的以下代碼,但我收到以下錯誤

Makefile:13: *** missing separator. Stop.

但我也試圖了解如何實際鏈接/創建庫。

如果我在終端中的line 12之后運行它們工作的命令,而不是在makefile中。

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

main.o: main.c
    gcc -O -c -lm main.c main.h

addSorted.o: addSorted.c addSorted.h
    gcc -O -c -lm addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
    gcc -O -c -lm freeLinks.c

ar rc libmylib.a main.o addSorted.o freeLinks.o    //Error Line

ranlib libmylib.a

gcc -o foo -L. -lmylib foo.o

clean:
    rm -f myProgram main.o addSorted.o freeLinks.o

此外,如果您可以協助改進代碼,我將非常感激。

嘗試這個:

all: myProgram

myProgram: main.o libmylib.a #libmylib.a is the dependency for the executable
        gcc -lm -o myProgram main.o -L. -lmylib

main.o: main.c
        gcc -O -c main.c main.h

addSorted.o: addSorted.c addSorted.h
        gcc -O -c addSorted.c

freeLinks.o: freeLinks.c freeLinks.h
        gcc -O -c freeLinks.c

libmylib.a: addSorted.o freeLinks.o #let's link library files into a static library
        ar rcs libmylib.a addSorted.o freeLinks.o

libs: libmylib.a

clean:
        rm -f myProgram *.o *.a *.gch #This way is cleaner than your clean

這組規則首先編譯所有文件,然后使庫(libmylib.a)成為目標並使用它的工件鏈接可執行文件。 我還添加了單獨的冗余目標表單,僅制作庫。 需要的文件:

user@host> ls
addSorted.c  addSorted.h  freeLinks.c  freeLinks.h  main.c  main.h Makefile

makefile不是shell腳本。 它是專家系統的配置文件。 特別是一個專家系統,如果你告訴它,它知道如何有效地創建文件及其依賴關系,只需要重新制作不需要重新制作的文件。

如果你看一下你的第一條規則:

myProgram: main.o addSorted.o freeLinks.o
    gcc -lm -o myProgram main.o addSorted.o freeLinks.o

告訴系統如果決定它需要這樣做,如何制作名為“myProgram”的文件。 冒號后面的部分是myProgram需要的文件。 如果它們不存在,或者決定它們已經過時,make會嘗試找到一些可用於創建或更新它們的配方。 完成所有操作后,make會執行“gcc ...”行並假定將創建或更新myProgram。

您擁有的ar和ranlib行與makefile規則所需的語法不匹配。 從它們的外觀來看,它們似乎是制作libmylib.a的秘訣。 如果你把它們放入語法make需要說,你得到:

libmylib.a: main.o addSorted.o freeLinks.o
    ar rcu libmylib.a main.o addSorted.o freeLinks.o
    ranlib libmylib.a

myProgram應該依賴於庫本身,而不是庫的內容,最好將庫選項放在最后:

myProgram: libmylib.a
    gcc -o myProgram libmylib.a -lm

如果你願意,你可以使用一個選項告訴gcc在當前目錄中查找庫:

gcc -L. -o myProgram main.o -lmylib -lm

還有makefile變量可以幫助你不必重復這么多,所以我會把第一條規則寫成:

myProgram: libmylib.a
    gcc -L. -o $@ -lmylib -lm

但是,main.o不太可能實際上是庫的一部分,所以:

myProgram: main.o libmylib.a
    gcc -L. -o $@ $< -lmylib -lm

和圖書館規則如下:

libmylib.a: addSorted.o freeLinks.o
    ar rcu $@ $+
    ranlib $@

$ +這里表示“所有依賴文件名”。

最后,如果你想讓gcc創建一個實際的靜態可執行文件,而不只是使用你創建的庫,你需要將'-static'選項傳遞給gcc。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM