有没有一种方法可以创建仅使用必需的 .o 文件的 makefile?
Is there a way to create makefile that uses only required .o files?
我想创建一个可以同时编译 多个 程序的 makefile。可能有一些 .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)
"Is there a way to list .o files that are required by specific program?"
是的。手动列出它们(或至少是所需的来源,并替换)。
目录搜索功能也可以派上用场,但这取决于您的项目结构实际是什么样子。
恕我直言,最简单的方法是将 .o
文件捆绑到库中,链接器将自动选择特定目标实际需要的内容。
这样做的方法是将除具有 main()
函数的目标文件之外的所有目标文件构建到一个库中,并 link 使用该库。建立图书馆是这样的:
libfoo.a: $(LIBOFILES)
ar rcu $@ $(LIBOFILES)
ranlib $@
然后您还要设置 Makefile 以使用库:
LDFLAGS = -L.
LDLIBS = -lfoo
我想创建一个可以同时编译 多个 程序的 makefile。可能有一些 .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)
"Is there a way to list .o files that are required by specific program?"
是的。手动列出它们(或至少是所需的来源,并替换)。
目录搜索功能也可以派上用场,但这取决于您的项目结构实际是什么样子。
恕我直言,最简单的方法是将 .o
文件捆绑到库中,链接器将自动选择特定目标实际需要的内容。
这样做的方法是将除具有 main()
函数的目标文件之外的所有目标文件构建到一个库中,并 link 使用该库。建立图书馆是这样的:
libfoo.a: $(LIBOFILES)
ar rcu $@ $(LIBOFILES)
ranlib $@
然后您还要设置 Makefile 以使用库:
LDFLAGS = -L.
LDLIBS = -lfoo