我創建了一個 Makefile 以及一些 C 源代碼檔案和一個頭檔案 (.h)。
NAME = libft.a
SRCS = ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c ft_isprint.c ft_strlen.c ft_bzero.c ft_memcpy.c ft_memset.c ft_memmove.c ft_strlcpy.c ft_strlcat.c ft_toupper.c ft_tolower.c ft_strchr.c ft_strrchr.c ft_strncmp.c ft_memchr.c ft_memcmp.c ft_strnstr.c ft_atoi.c ft_calloc.c ft_strdup.c ft_substr.c ft_strjoin.c ft_strtrim.c ft_split.c ft_itoa.c ft_strmapi.c ft_striteri.c ft_putchar_fd.c ft_putstr_fd.c ft_putendl_fd.c ft_putnbr_fd.c
SRC_BONUS = ft_lstnew.c ft_lstadd_front.c ft_lstsize.c ft_lstlast.c ft_lstadd_back.c ft_lstdelone.c ft_lstclear.c ft_lstiter.c ft_lstmap.c
OBJECTS = $(SRCS:.c=.o)
OBJ_BONUS = $(SRC_BONUS:.c=.o)
CFLAGS = -Wall -Wextra -Werror
all: $(NAME)
$(NAME): $(OBJECTS)
ar rc $(NAME) $(OBJECTS)
$(OBJECTS): $(SRCS)
gcc $(CFLAGS) -c $(SRCS)
$(OBJ_BONUS): $(SRCS) $(SRC_BONUS)
gcc $(CFLAGS) -c $(SRCS) $(SRC_BONUS)
bonus: $(OBJECTS) $(OBJ_BONUS)
ar rc $(NAME) $(OBJECTS) $(OBJ_BONUS)
我必須用那些 C 源代碼檔案創建目標檔案,然后使用這些目標檔案或創建一個靜態庫 (.a)。
所以,我想知道是否有一種方法可以逐個編譯每個源代碼檔案,而不是一步編譯所有這些檔案?
gcc -Wall -Wextra -Werror -c ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c ft_isprint.c ft_strlen.c ft_bzero.c ft_memcpy.c ft_memset.c ft_memmove.c ft_strlcpy.c ft_strlcat.c ft_toupper.c ft_tolower.c ft_strchr.c ft_strrchr.c ft_strncmp.c ft_memchr.c ft_memcmp.c ft_strnstr.c ft_atoi.c ft_calloc.c ft_strdup.c ft_substr.c ft_strjoin.c ft_strtrim.c ft_split.c ft_itoa.c ft_strmapi.c ft_striteri.c ft_putchar_fd.c ft_putstr_fd.c ft_putendl_fd.c ft_putnbr_fd.c
一次編譯每個源代碼檔案還是一個一個地編譯是一樣的嗎?
這顯然不會發生在庫中,我只需要一個靜態庫即可擁有所有這些功能,因此我必須使用所有目標檔案來創建它。
gcc -Wall -Wextra -Werror -c ft_isalnum.c ft_isalpha.c ft_isascii.c ft_isdigit.c ft_isprint.c ft_strlen.c ft_bzero.c ft_memcpy.c ft_memset.c ft_memmove.c ft_strlcpy.c ft_strlcat.c ft_toupper.c ft_tolower.c ft_strchr.c ft_strrchr.c ft_strncmp.c ft_memchr.c ft_memcmp.c ft_strnstr.c ft_atoi.c ft_calloc.c ft_strdup.c ft_substr.c ft_strjoin.c ft_strtrim.c ft_split.c ft_itoa.c ft_strmapi.c ft_striteri.c ft_putchar_fd.c ft_putstr_fd.c ft_putendl_fd.c ft_putnbr_fd.c
uj5u.com熱心網友回復:
是的,這是可能的。
像這樣
SRC = $(wildcard src/*.c)
OBJECTS = $(SRC:%.c=%.o)
INCLUDE = -Iinclude
NAME = test
binary: $(OBJECTS)
gcc -o $(NAME) $(OBJECTS)
%.o: %.c
gcc -o $@ -c $< $(INCLUDE)
當然,您必須使其適應您的makefile。
關鍵部分是為每個 *.o 執行的最后一個目標(并且每個 *.o 依賴于它的 *.c 檔案,所以這個 *.o 只會在它比 *.c 檔案更早時被編譯)。main.c在具有兩個檔案的專案中呼叫該 makefile 的輸出other.c可能如下所示:
>$ make binary
gcc -o src/other.o -c src/other.c -Iinclude
gcc -o src/main.o -c src/main.c -Iinclude
gcc -o test src/other.o src/main.o
您可以在這里找到一些可能對您有幫助的提示:http:
//nuclear.mutantstargoat.com/articles/make/
PS:
我建議使用源目錄和包含目錄(通常是“src”和“include”)和輸出目錄(“build”或“out”在這里很常見)。讓您的生活和 makefile 更輕松。
uj5u.com熱心網友回復:
使用CMake的解決方案:
首先,創建一個 CMakeLists.txt 檔案:
cmake_minimum_required ( VERSION 3.10 )
project ( MyWonderfulProject )
file ( GLOB MySources *.c )
add_library ( MyWonderfulProject STATIC ${MySources} )
然后創建一個構建目錄:
$ mkdir build
$ cd build
然后從 CMake 指令創建一個 Makefile 并編譯:
$ cmake ..
$ make
瞧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485085.html
上一篇:空手道參考錯誤:未定義包
下一篇:C前處理器中的型別檢查
