- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在尝试构建一个合适的 Makefile。
我想要的是完全控制正在发生的事情,所以我不想要任何第三方软件。
我目前的尝试对我来说似乎是合乎逻辑的,但由于依赖项生成无效,我有点卡住了。
为了更好的可读性,完整的 Makefile 被分成了小块。如果有任何需要改进的地方,我将不胜感激。
首先,我有以下静态定义
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
Afaik 这应该没问题。将分析标志设为可选是完美的,但这并不重要。
SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o
TARGET = ./bin/my_target
SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
基本上,这应该只是从子文件夹 src
中提取所有 *.cpp
文件,并另外将 ./src
替换为 ./obj
和 .cpp
以 .o
作为对象的名称。
.PHONY: clean all depend
all: $(TARGET)
$(TARGET): $(OBJS)
@echo "-> linking $@"
@$(CXX) $^ $(LDFLAGS) -o $@
$(OBJ_DIR)/%.$(EXT_OBJ):
@echo "-> compiling $@"
@$(CXX) $(CXXFLAGS) -c $< -o $@
Afaik,这个 block - 如果存在有效的依赖文件 - 应该进行所有必要的编译和链接。
clean:
@echo "removing objects and main file"
@rm -f $(OBJS) $(TARGET)
应该是不言自明和正确的,还是我在这里遗漏了什么?
$(SRC_DIR)/%.$(SRC_EXT):
$(CXX) $(DEPFLAGS) -MT \
"$(subst $(SRC_DIR),$(OBJ_DIR),$(subst $(SRC_EXT),$(OBJ_EXT),$@))" \
$(addprefix ,$@) >> $(DEP);
clear_dependencies:
@echo "-> (re-)building dependencies";
@$(RM) $(DEP)
depend: clear_dependencies $(SRCS)
这是非功能部分。我打算做的是使用 g++
编译器标志 -MM
自动创建依赖项并使用 -MT
使用与默认一个。生成的依赖项应该如下所示
./obj/main.o: ./src/main.cpp ./src/some_header_file.h
不幸的是,这永远不会被调用,我不知道为什么会这样。在 similar question ,用户 Beta 很高兴地通过添加 .Phony
提供了一个临时解决方案,但这对重建每个对象没有任何改变有副作用。
最后只有一行
-include $(DEP)
包含依赖文件,一旦创建。
非常欢迎提供有关任何部分的一些提示的任何答案。所以我的问题是:我可以做些什么更好或者“更干净”,为什么依赖项生成不起作用?
最佳答案
开始吧。
分配 simply expanded variables在可能的情况下:
SRCS := $(wildcard $(SRC_DIR)/*$(SRC_EXT))
来自 GNU Make manual :
Another disadvantage [of recursively expanded variables] is that any functions referenced in the definition will be executed every time the variable is expanded. This makes
make
run slower; worse, it causes thewildcard
andshell
functions to give unpredictable results because you cannot easily control when they are called, or even how many times.
使用substitution references或 patsubst
function将源转换为对象:
OBJS := $(SRCS:$(SRC_DIR)/%$(SRC_EXT)=$(OBJ_DIR)/%$(OBJ_EXT))
在编译模式规则中指定适当的先决条件。这是强制让 Make 保持您的目标文件最新并在源更改时更新它们。
$(OBJ_DIR)/%$(OBJ_EXT) : $(SRC_DIR)/%$(SRC_EXT)
@echo "-> compiling $@"
@$(CXX) $(CXXFLAGS) -o $@ -c $<
编译源代码并同时为它们生成依赖文件。使用 -MMD -MP
标志让事情正常进行(只需将它们附加到 CXXFLAGS
)。
CXXFLAGS += -MMD -MP
-include $(OBJS:$(OBJ_EXT)=.d)
来自 GCC manual :
-MD
-MD
is equivalent to-M -MF
file, except that-E
is not implied. The driver determines file based on whether an -o option is given. If it is, the driver uses its argument but with a suffix of.d
, otherwise it takes the name of the input file, removes any directory components and suffix, and applies a.d
suffix.
-MMD
Like
-MD
except mention only user header files, not system header files.
-MP
This option instructs CPP to add a phony target for each dependency other than the main file, causing each to depend on nothing. These dummy rules work around errors
make
gives if you remove header files without updating theMakefile
to match.
也考虑学习this article Paul Smith 的(他是 GNU Make 的维护者)。它很好地概述了不同的 autodep 生成方法。
关于c++ - Makefile 改进,依赖生成不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455480/
我对编码还比较陌生,但并非完全没有经验。处理有关金融计算器的学校作业。如果你们中的任何人可以查看我的代码以了解不良做法/可能的改进等,那就太好了。 我确实添加了一个“动画”启动(有很多 printf
小目标Trick 论文链接: https://paperswithcode.com/paper/slicing-aided-hyper-inference-and-fine-tuning 代码链接:h
if (firstPositionCpc && (firstPosition > 0 && firstPositionCpc 0 && topOfPageCpc 0 && firstPageCpc
我有 2 个表:“packages”和“items”。 “packages”有以下列:pack_id | item_id “items”有以下列......:item_id |输入 一个包可以有多个
我目前有一个 Pandas Dataframe,我在其中执行列之间的比较。我发现一种情况,在进行比较时存在空列,由于某种原因比较返回 else 值。我添加了一个额外的语句来将其清理为空。看看我是否可以
我正在处理一个查询,通过首先舍入它们的主要日期时间键来连接一个数据库中的多个表。数据库包含来自 openhab 的性能数据,每个表只有一个名为 Time 的主日期时间行和一个名为 Value 的值行。
问候 我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.
我想在下学期的类(class)中取得领先,所以我制作了这个基本版本的 Blackjack 来开始理解 C 的基础知识,我希望您有任何想法可以帮助我更好地理解 C 和其正常的编码实践。 C 中的很多东西
我有一个要求,比如: 给定一个数组,其中包含随机数。需要输出元素出现的次数,有自带解决方案: var myArr = [3,2,1,2,3,1,4,5,4,6,7,7,9,1,123,0,123];
这是我的数据库项目。 表user_ select id, name from user_; id | name ----+---------- 1 | bartek 2 | bartek
我已经完成了一个小批量脚本来调整(动态)一些图像的大小: for a in *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP} ; do convert "$a" -resiz
是否有更 pythonic 的方法来执行以下代码?我想在一行中完成 parsed_rows 是一个可以返回大小为 3 或 None 的元组的函数。 parsed_rows = [ parse_row(
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
下面的代码完成了我想要的,但还有其他更像 python 风格的方式吗? 文件格式: key1:value1,key2:value2,... key21:value21,key22:value22,..
如果两个英文单词只包含相同的字母,则它们是相似的。例如,food 和 good 不相似,但 dog 和 good 相似。 (如果A与B相似,则A中的所有字母都包含在B中,B中的所有字母都包含在A中。)
我有以下结构来表示二叉树: typedef struct node *pnode; typedef struct node { int val; pnode left; pnode
我有一个区域,它由受约束的 delaunay 三角剖分表示。我正在解决在两点之间寻找路径的问题。我正在使用 Marcelo Kallmann 提供的论文作为解决此问题的引用点。然而,而不是使用 Kal
如果我需要检查文本(字符串)中是否存在单词 A 或单词 B,如果我这样做会有性能差异: if(text.contains(wordA) || text.contains(wordB)) 要使用一些正则
Adjust To 我有上面这个简单的页面,上面有一个标签和一个文本框。我想在文本框中输入文本。 对我有帮助的 XPATH 是 //*[contains(tex
以下伪代码的elisp代码 if "the emacs version is less than 23.1.x" do something else something-else 写成 (if
我是一名优秀的程序员,十分优秀!