使用 depend将对象文件保存在相同的生成文件目录中
Save object files in same makefile directory using depend
我有这个makefile
appname := fun
srcfiles := $(shell find .. -name "*.cpp")
headerfiles := $(shell find .. -name "*.hpp")
objects := $(patsubst %.cpp, %.o, $(srcfiles))
all: $(srcfiles) $(appname)
$(appname): $(objects)
$(CXX) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)
depend: .depend
.depend: $(srcfiles) $(headerfiles)
rm -f ./.depend
$(CXX) $(CXXFLAGS) -MM $^>>./.depend;
clean:
rm -f $(appname) $(objects)
dist-clean: clean
rm -f *~ .depend
include .depend
其中makefile
的父目录包含所有代码(.hpp
和.cpp
文件)。不幸的是,.o
文件保存在源代码中,而我希望它们保存在可执行文件(和makefile
)的同一目录中。这与 Eclipse CDT 中的Default
相同。
如何修改makefile
才能做到这一点?
PS:我发现了类似的问题,比如这个问题,但他们都没有使用depend
来定义$(objects)
任务(它们都是'%.o%'的形式)。
当您设置 objects
变量时,您只需将完整的路径名带到.cpp
文件并将后缀替换为 .o
。 因此,如果您有像my/sub/dir/foo.cpp
这样的文件,那么objects
将包含路径my/sub/dir/foo.o
。 所以,当然当你编写规则$(appname): $(objects)
时,make会尝试构建文件my/sub/dir/foo.o
。 如果你希望它只构建foo.o
,那么你也必须剥离路径,而不仅仅是替换后缀:
objects := $(patsubst %.cpp,%.o,$(notdir $(srcfiles)))
现在,当然,make会说它不知道如何构建foo.o
,因为默认规则只知道如何从.cpp
构建.o
,而不是从my/sub/dir
中存储的.cpp
文件。
要完成这项工作,最简单的解决方案是使用 VPATH,您可以从从srcfiles
获得的目录列表中构造 VPATH 的值,如下所示:
VPATH := $(sort $(dir $(srcfiles)))
您还可以考虑使用更好的依赖项生成解决方案,例如此处描述的解决方案。
相关文章:
- C++ 读取整个文件目录
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 如何将 pls 文件保存在 QMediaPlaylist 而不是 m3u 中
- 通过搜索硬盘驱动器查找文件目录
- 在 Apache Velocity 模板语言中获取文件目录
- 将文件目录打印到数据结构中
- 来自提升的分段错误(提升:文件系统:存在)
- 如何从文件中存在的路径中检索环境变量
- 关于使用ifstream在C 中确定文件是否存在的问题
- 成功使用CMakeLists制作后如何修复"open: No such file or directory"错误(该文件实际上存在)
- 是否可以在编译后创建 CMake 目标和文件目录?
- ifstream不读取文件中存在的`0a`字节
- Boost文件系统存在访问违规
- 带有引号+组合目录 c++ 的 ifstream 文件目录
- 检查给定的多个文件是否存在
- 英特尔 DAAL 头文件可能存在问题
- C++'Undefined reference to'错误,尽管包含路径中的头文件中存在函数定义
- 如何在 Windows 上的 c++ 中管理文件/目录的发现和使用
- 如何从Windows中的可执行文件中推断出文件/目录路径
- 错误:没有这样的文件或目录存在