簡體   English   中英

與GCC Makefile斗爭

[英]Struggling with a GCC Makefile

我試圖寫出我認為將是一個簡單的Makefile的文件,但我感到莫名其妙! 我不是Makefile編寫者,但我認為我對它們的理解足以使他們能夠簡單地工作。

好的,我在目錄中有一個小項目,並且在此目錄中還有一個包含許多.c文件的libs目錄。 我想做的是編寫一個makefile,它將/ libs目錄的內容構建到/ libs目錄中的靜態lib文件中,然后編譯/目錄中的一些源文件,並將其鏈接到已構建的.a上。文件。

我確定有人會建議“為什么不使用cmake”,但這並不是我正在尋找的答案(像絕地武士一樣揮舞着手.. ehehehehe)

CC = gcc
CFLAGS = -Wall
SOURCES = lzx.c csum.c dirs.c listner.c tree.c
OBJECTS = $(SOURCES:.c=.o)
TARGETLIB = libs/mylib.a
TARGET = TestApp

libs/%.o : libs/%.c
    $(CC) $CFLAGS -c $<

$(TARGETLIB) : $(OBJECTS)
    ar rcs $@ $^

$(TARGET) :
    $(CC) $CFLAGS Source1.cpp Source2.cpp -llibs/mylib.a -o $@

我的理解是,第一個配方會將所有.c文件編譯成對象,但似乎先編譯第一個.c文件然后停止。

任何人都可以給我的幫助將不勝感激。

由於您的最終應用程序是TARGET,因此應首先使其成為Makefile規則。 並且由於它也依賴於TARGETLIB,因此應將其作為依賴項,例如:

$(TARGET): $(TARGETLIB)
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -Lmylib -o $@

接下來,我假設您提到的* .c文件是lib文件。 因此,您將需要為其添加前綴,因為您希望手動指定它們,而不是通配符或規則。

OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o)

最后我想到的是庫名,它應該是libSOMENAME.a(好吧,鏈接程序在path和-Lotherpaths中搜索該名稱)。 因此,我們有:

TARGETLIB = libs/libmylib.a

總結一下:

CC = gcc
CFLAGS = -Wall
SOURCES = lzx.c csum.c dirs.c listner.c tree.c
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o)
TARGETLIB = libs/libmylib.a
TARGET = TestApp

$(TARGET) : $(TARGETLIB)
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -static -L./libs -lmylib -o $@

$(TARGETLIB) : $(OBJECTS)
    ar rcs $@ $^

是的,這可以寫得更好,但是我想如果您想了解更多關於Makefiles或鏈接器的信息,而不僅僅是顯示您在哪里出錯,您將知道如何找到手冊頁。

暫無
暫無

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

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