c++ - 有没有一种方法可以创建仅使用必需的 .o 文件的 makefile?

标签 c++ makefile

我想创建一个 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)

最佳答案

做到这一点的方法是将所有目标文件构建到一个库中,并与库链接,除了那些具有 main() 函数的目标文件。构建一个库是这样的:

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

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

LDFLAGS = -L.
LDLIBS  = -lfoo

关于c++ - 有没有一种方法可以创建仅使用必需的 .o 文件的 makefile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954273/

相关文章:

c++ - OpenGL 缓冲区更新

makefile - 迭代 Makefile 中的目录列表

c++ - 为在循环中多次调用的函数返回值预分配内存的正确方法是什么?

c++ - 如何在 C++ 中显示项目计数对列表?

c++ - 构建后 ncurses 无法正常工作

c++ - Opengl 3.3 C++运行时错误 'vector subscript out of range'

ubuntu - 分支子目录中的 Launchpad dailybuild 源

makefile - 依赖符号 "|"

xcode - OSX 10.6 "make"命令不工作

c++ - 为什么编译后没有.o?