gpt4 book ai didi

c++ - 我怎样才能使我的 makefile 以我需要的方式将我的项目放在一起?

转载 作者:行者123 更新时间:2023-12-05 05:42:51 25 4
gpt4 key购买 nike

我已经浏览了大约 20 个关于 makefile 的不同网页,但我似乎仍然无法让它为我的项目工作。一个文件夹中包含所有文件的项目可以工作,但我无法让它与我的特定项目一起工作,因为我的所有文件都在不同的文件夹中。

示例结构

这是一个示例项目,它具有所有必要的特性和区别,在结构上与我的项目相同,但明显更小:

.
|-- bin
| |-- apple (executable 1) // needs apple's .o files (C++)
| |-- banana (executable 2) // needs banana's .o files + .so file (C/C++)
|-- include
| |-- format
| | |-- format.h
| |-- apple
| | |-- foo.h
| |-- banana
| |-- bar.h
|-- lib
| |-- apple
| | |-- apple_main.o
| | |-- apple_one.o
| |-- banana
| | |-- banana_main.o
| | |-- banana_one.o
| | |-- banana_two.o
| |-- archive_apple
| | |-- libapple_one.a
| |-- archive_banana
| | |-- libbanana_one.a
| | |-- libbanana_two.a
| |-- external
| | |-- foo.so
|-- makefile
|-- src
|-- drivers
| |-- apple_main.cpp // needs format.h
| |-- banana_main.cpp // needs format.h,
|-- apple
| |-- apple_one.cpp // needs format.h, foo.h
|-- banana
|-- banana_one.c // needs format.h, bar.h
|-- banana_two.cpp // needs format.h, bar.h

我一直在网上阅读有关自动生成 makefile 的内容,您可以在其中将某些内容输入到遍历文件夹的 makefile 中,并使用替换和其他内容来消除明确列出每条规则的需要,但没有一个他们工作了。我一定是做错了什么,但我不知道是什么。

我需要什么

我想将正确的内容放入我的 makefile 中,以创建您在上面看到的内容。

如您所见,项目的某些部分必须用 C 编写。(我想我可以将所有内容更改为 C++,但如果不需要,我不想这样做)。

我的编译器和标志将是:

CC := gcc
CXX := g++
C_FLAGS := -Wall -std=c17
CXX_FLAGS := -Wall -std=c++17

我的目录将使用 -I 来避免类似的事情

// #include "../../include/format/format.h"
// instead:
#include <format/format.h>

如果有帮助的话,我还将使用 -L,因为我想创建那些 .a 文件。据我所知,它是这样的:

libsomething.a: something.o
ar rvs ./lib/archive/libsomething.a ./lib/foo/something.o

为了将这个项目放在一起并生成我的可执行文件、目标文件和库,我的 makefile 中需要什么?

注意:我了解 makefile 的基础知识,例如规则的工作原理以及如何为小型简单项目手动组合 makefile,但我才刚刚开始了解内置函数和通配符以及其他复杂的东西。

当然,由于我的项目比这大得多,尽管结构相同,我需要的答案是通用的或易于修改的,就像我在网上看到的那些由于某种原因不起作用的 makefile 示例在我的项目上。这样,我就可以将其适应 future 的项目,而无需进行不必要的手动工作。

最好(除非这样做是不好的做法),我希望从库中构建可执行文件,类似于:

executable: something_main.o libfoo.a libbar.a
$(CXX_BUILD) -o ./bin/executable \
./lib/something_main.o \
-L./lib/something \
-lfoo -lbar

最佳答案

可能会有所帮助。

项目结构:

    xc
inc
src
test
inc
src
obj
xc
test
bin

生成文件

PNAME = xc
OBJS_DIR=obj
BIN_DIR=bin
INC_SUB_DIR=inc
SRC_SUB_DIR=src

CPP = gcc
#CPP += -m32

#LIBPATH = -Llib
LIBLIST += -lz
LDFLAGS += $(LIBPATH) $(LIBLIST)

UTILS_DIR = xc
UTILS_SRCS = $(wildcard $(UTILS_DIR)/$(SRC_SUB_DIR)/*.c)
UTILS_INCS = $(wildcard $(UTILS_DIR)/$(INC_SUB_DIR)/*.h)
UTILS_SLIST = $(UTILS_SRCS) $(UTILS_INCS)
UTILS_OLIST = $(wildcard $(OBJS_DIR)/$(UTILS_DIR)/*.o)
UTILS_OBJS = $(patsubst $(UTILS_DIR)/$(SRC_SUB_DIR)/%.c,$(OBJS_DIR)/$(UTILS_DIR)/%.o,$(UTILS_SRCS))

BASE_DIR = test
BASE_SRCS = $(wildcard $(BASE_DIR)/$(SRC_SUB_DIR)/*.c)
BASE_INCS = $(wildcard $(BASE_DIR)/$(INC_SUB_DIR)/*.h)
BASE_SLIST = $(BASE_SRCS) $(BASE_INCS)
BASE_OLIST = $(wildcard $(OBJS_DIR)/$(BASE_DIR)/*.o)
BASE_OBJS = $(patsubst $(BASE_DIR)/$(SRC_SUB_DIR)/%.c,$(OBJS_DIR)/$(BASE_DIR)/%.o,$(BASE_SRCS))

SLIST += $(UTILS_SLIST) $(BASE_SLIST)
OLIST += $(UTILS_OLIST) $(BASE_OLIST)
OBJS += $(UTILS_OBJS) $(BASE_OBJS)

INCPATH = -I$(UTILS_DIR)/$(INC_SUB_DIR) -I$(BASE_DIR)/$(INC_SUB_DIR)
CPPFLAGS += -c -Wall -Wextra
#CPPFLAGS += -O2
CPPFLAGS += $(INCPATH)
#CPPFLAGS += -g

# target
.PHONY = all

all: $(PNAME)

packsrc:
tar zcvf $(PNAME)-src-`date +%Y%m%d%H%M%S`.tgz $(SLIST) doc Makefile

slib:
$(AR) rcs $(PNAME)-`date +%Y%m%d%H%M%S`.a $(OBJS)

clean:
$(RM) $(OLIST) $(BIN_DIR)/$(PNAME)

$(PNAME): $(OBJS)
@ mkdir -p $(BIN_DIR)
@ mkdir -p $(OBJS_DIR)
@ mkdir -p $(OBJS_DIR)/$(UTILS_DIR)
@ mkdir -p $(OBJS_DIR)/$(BASE_DIR)
$(CPP) $^ -o $(BIN_DIR)/$@ $(LDFLAGS)

$(OBJS_DIR)/$(UTILS_DIR)/%.o:$(UTILS_DIR)/$(SRC_SUB_DIR)/%.c
$(CPP) $(CPPFLAGS) $< -o $@

$(OBJS_DIR)/$(BASE_DIR)/%.o:$(BASE_DIR)/$(SRC_SUB_DIR)/%.c
$(CPP) $(CPPFLAGS) $< -o $@

dos2unix:
dos2unix $(SLIST)

关于c++ - 我怎样才能使我的 makefile 以我需要的方式将我的项目放在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71934550/

25 4 0