有没有办法创建仅使用所需 .o 文件的生成文件

Is there a way to create makefile that uses only required .o files?

本文关键字:文件 创建 有没有      更新时间:2023-10-16

我想创建一个同时编译多个程序的makefile。可能有一些.cpp文件被所有人使用,而一些.cpp文件仅由一个单独使用。我目前的制作文件如下:

CPPFLAGS = -std=c++14 -MMD -pthread 
TARGETS = server.cpp client.cpp
SRC = $(wildcard *.cpp)
NON_TARGET_SRC = $(filter-out $(TARGETS),$(SRC))
all: $(TARGETS:%.cpp=%)
clean:
    rm -rf *.o
    rm -rf *.d
$(TARGETS:%.cpp=%): % : $(NON_TARGET_SRC:%.cpp=%.o) %.o ###redundant?
    g++ $(CPPFLAGS) -o $@ $^
-include $(SRC:%.cpp=%.d)

服务器.cpp和客户端.cpp是包含main()函数的文件的名称,应该编译为可执行文件,而不是.o文件。虽然上面的 makefile 有效,但我认为它确实是多余的,因为它使用所有非目标 .o 文件进行最终编译,而它可能应该只使用所需的文件(或者链接器是否自行选择所需的文件,使此类命令的开销可以忽略不计?所以,问题是:

有没有办法列出特定程序所需的.o文件?

编辑:

下面的代码似乎工作得很好,这要归功于将所有对象文件打包到一个库文件中。

CPPFLAGS = -std=c++14 -MMD -pthread 
TARGETS = server.cpp client.cpp
LIBRARY_NAME=objects
LIBRARY_FILE=lib$(LIBRARY_NAME).a
SRC = $(wildcard *.cpp)
NON_TARGET_SRC = $(filter-out $(TARGETS),$(SRC))
LDFLAGS = -L.
LDLIBS = -l$(LIBRARY_NAME)
all: $(TARGETS:%.cpp=%)
clean:
    rm -rf *.o
    rm -rf *.d
    rm -rf *.a
$(TARGETS:%.cpp=%): % : $(LIBRARY_FILE) %.o
    g++ $(CPPFLAGS) -o $@ $*.o $(LDFLAGS) $(LDLIBS)
$(LIBRARY_FILE): $(NON_TARGET_SRC:%.cpp=%.o)
    ar rcu $@ $(NON_TARGET_SRC:%.cpp=%.o)
    ranlib $@
-include $(SRC:%.cpp=%.d)
执行此操作

的方法是将所有对象文件(具有main()函数的对象文件除外)构建到库中并与库链接。构建库是这样的:

libfoo.a: $(LIBOFILES)
    ar rcu $@ $(LIBOFILES)
    ranlib $@

然后,您还将生成文件设置为使用该库:

LDFLAGS = -L.
LDLIBS  = -lfoo

"有没有办法列出特定程序所需的.o文件?"

是的。手动列出它们(或至少是所需的来源,并替换)。

目录搜索功能也可以派上用场,但这取决于您的项目结构的实际外观。

恕我直言,最简单的方法是将.o文件捆绑到库中,链接器将自动选择特定目标的实际需要。