有没有办法创建只使用所需.o文件的makefile?

时间:2015-01-14 23:18:51

标签: c++ makefile

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

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)

Server.cpp和client.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)

2 个答案:

答案 0 :(得分:2)

这样做的方法是将除main()函数之外的所有目标文件构建到库中并与库链接。建立一个像这样的库:

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

然后您还要将Makefile设置为使用库:

LDFLAGS = -L.
LDLIBS  = -lfoo

答案 1 :(得分:0)

  

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

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

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

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