- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的项目中有以下目录结构:
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
文件夹include/
包含*.hpp
,而*.cpp
位于src/
。我想将所有源代码编译到 bin/
,然后将它们链接到 dist/
。对我来说这似乎是一个相当合理的愿望。
我想知道针对这种情况的 Makefile 的最佳实践。我所能找到的只是 %.o: %.cpp
目标,但这并没有真正起作用,因为源和二进制文件夹不同。
我试图使用这样的东西:
D_SRC = src
D_BIN=bin
F_CPP := $(shell find $(D_SRC) -iname '*.cpp' -type f)
F_OBJ := $(shell echo $(F_CPP) | sed s:\ :\\n:g | sed s:$(D_SRC):$(D_BIN): | sed 's:^\(.*\)\.cpp$$:\1\.o:')
$(F_OBJ): $(F_SRC)
$(foreach file, $(F_SRC), \
$(GXX) $(CXXFLAGS) -c $(file)\
)
此目标不起作用,因为 $(F_OBJ)
路径以 bin/
开头,而 foreach
将源代码编译到当前工作目录。我可以将其编译为 bin/
,但只有再添加几个 sed
表达式才会发生这种情况,而且它本身就够难看的了。
这对我来说可能很难,因为我不太了解make
,但我不能是唯一一个设置这个项目的人。在我看来,这一定是一种很常见的现象。我知道我可以分别为每个模块编写一个 Makefile
,但这真的是最好的选择吗?
编辑:我现在想知道使用几个 Makefile 可以实现什么目标。如果一个位于根目录,另一个位于 src/module_a
中,后者如何知道 bin/
?如果您使用 make -f src/module_a/Makefile 执行它,它将与从根目录执行它相同,因为它的工作目录将是根目录。我想,另一种方法是在执行之前更改目录,如下所示:make -C include/module_a,但在这种情况下,它将如何找到bin/?我不想在 Makefile 中包含类似 D_BIN = ../../bin
的内容。
最佳答案
我通常做的是在 src 目录中有一个 Makefile(如果您愿意,可以从顶层 Makefile 调用),然后使用如下规则:
D_BIN = ../bin
$(D_BIN)/%.o: %.cpp
您还可以仅在顶级目录中尝试一个 makefile,并使用如下所示的规则:
D_BIN = bin
D_SRC = src
$(D_BIN)/%.o: $(D_SRC)/%.cpp
但我没有使用过这样的规则,所以我不知道与我通常的方式相比的优点/缺点。我通常的方式工作得很好,我什至有构建依赖的规则,如下所示:
$(D_BIN)/%.d: %.cpp
链接规则如下:
../dist/outexe: $(F_OBJ)
使用 foreach 通常不受欢迎,因为它没有利用普通 makefile 规则中内置的所有功能(即,没有基于每个文件的依赖检查,要么构建所有内容,要么什么也不构建),因此 foreach应该只用作最后的手段,但在这种情况下,您将能够在没有 foreach 的情况下让它工作。
除此之外,还有更简单的方法来构建文件列表,您不需要使用 shell 或 sed。
F_CPP = $(wildcard *.cpp)
F_OBJ = $(F_CPP:.cpp=.o)
更新:这是我通常发出递归 make 的方式:
SUBDIRS = src
.PHONY: $(SUBDIRS)
all: $(SUBDIRS)
$(SUBDIRS):
@echo "Building $@..."
$(MAKE) -C $@ $(MFLAGS)
那么实际上在您的子制作中,您需要使用 ../bin 例如。
但是,对于像您这样简单的项目,您最好在根级别使用一个 makefile 并使用如下规则:
D_BIN = bin
D_SRC = src
$(D_BIN)/%.o: $(D_SRC)/%.cpp
如果您有一个非常复杂的目录结构,并且随着时间的推移,您将在其中添加/删除/修改新的目录树,则递归生成文件是可以的(可以但不是很好)。但对于一个简单的项目,您只想为代码和 obj 建立单独的目录,这可能有点过分了。
关于makefile - Makefile 的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688651/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!