有没有办法创建仅使用所需 .o 文件的生成文件
Is there a way to create makefile that uses only required .o files?
我想创建一个同时编译多个程序的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
文件捆绑到库中,链接器将自动选择特定目标的实际需要。
相关文章:
- 终端不会为C++文件创建.exe文件吗
- 如何从具有两列的.txt文件创建并行数组?
- 从 .lib 文件创建一个.dll文件
- 如何从输入文件 c++ 创建随机名称生成器
- 无法从 cso 文件创建顶点着色器(从 fx 文件创建)
- 如何为多个目录中的多个文件创建生成文件?
- 在编译时从 c++ 文件创建枚举
- 如何在运行时从 c++ 中的 DLL 文件创建对象?
- 文件创建并不总是成功
- 如何使用 QFile、c++ 从文件创建整数数组
- 您可以使用 makefile 从 .o 对象文件创建 C++ 文件吗?
- 从函数中的dat文件创建一个2维数组
- 如何为 cpp 和 h 文件创建别名(并忽略编译器__attributes__)
- 如何从现有的生成文件创建 CMake 文件?
- 为什么我无法使用文本文件创建文件映射?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 从文本文件创建 2D 字符串矢量
- ofStream: - 尽管文件创建了,但文本文件上没有输出
- 从语言文件创建JSON对象
- 将文本文件创建到节点.js的插件C++