- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试为项目编写 Makefile。这样,每当任何 C 文件发生变化时,我都能够构建项目。但是,当头文件发生变化时,它不会构建。
所以,我正在尝试使用 Makefile 来获得更简单的目录结构,如果可行,我计划在主项目中做同样的事情。
目录结构是,
src -> code1 -> file1.c
src -> code2 -> file2.c
src -> code1inc -> file1.h
src -> code2inc -> file2.h
所有文件一起构建并给出一个二进制FinalBin
当 file1.h 发生变化时,它只需要构建 file1.c。我如何通过 Makefile 强加这个?
这是我当前的 Makefile。
CC = gcc
CFLAGS = $(INCLUDES)
TARGET = FinalBin
SOURCES := $(wildcard *.c)
PATH_CODE1 = src/code1
PATH_CODE2 = src/code2
CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
CODE1_OBJECTS := $(patsubst %.c,%.o,$(CODE1_SOURCES))
CODE2_SOURCES := $(wildcard $(PATH_CODE2)/*.c)
CODE2_OBJECTS := $(patsubst %.c,%.o,$(CODE2_SOURCES))
PATH_CODE1INC = src/code1inc
PATH_CODE2INC = src/code2inc
INCLUDES = -I$(PATH_CODE1INC) \
-I$(PATH_CODE2INC)
CODE1_HEADERS := $(wildcard $(PATH_CODE1INC)/*.h)
CODE2_HEADERS := $(wildcard $(PATH_CODE2INC)/*.h)
all: $(TARGET)
obj1 = $(CODE1_OBJECTS) $(CODE1_HEADERS)
obj2 = $(CODE2_OBJECTS) $(CODE2_HEADERS)
$(TARGET) : $(obj1) $(obj2)
$(CC) $^ -o $@
clean:
rm $(TARGET) $(CODE1_OBJECTS) $(CODE2_OBJECTS)
请指导我。
最佳答案
我觉得你的所作所为很不寻常。
典型的方法是有一个源文件列表,可以手动编写或自动评估,例如通过从一个或多个目录中捕获所有 c 文件。这就是您已经执行的操作:CODE1_SOURCES := $(wildcard $(PATH_CODE1)/*.c)
但是每个文件的依赖应该是自动生成的。例如 gcc 提供 '-M' 或 '-MM' 选项来重建所谓的依赖文件,通常命名为 '.d' 或 '.dep'
完整过程的好文档可以在这里找到:
http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#basic
对于简单的情况,这是从上述文档中获取的示例:
SRCS = foo.c bar.c ...
%.o : %.c
@$(MAKEDEPEND); \
cp $*.Td $*.d; \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.Td >> $*.d; \
rm -f $*.Td
$(COMPILE.c) -o $@ $<
include $(wildcard $(SRCS:.c=.d))
如果使用 gcc MAKEDEPEND 可以:
MAKEDEPEND = gcc -M $(CPPFLAGS) -o $*.Td $<
一个简短的解释:
通常,您定义如何从 %.o 文件生成 %.o 文件的规则:
%.o : %.c
作为该规则的第一步,如果必须编译源代码,通常是在 %.o 文件不存在或依赖项比 %.o 文件新的情况下始终构建 depfile:
gcc -M $(CFLAGS) -o $*.Td $<
摘录中给出的最后一行确实包含了所有这些自动生成的依赖文件,只需将它们包含到 Makefile 本身中:
include $(wildcard $(SRCS:.c=.d))
关于c - 在头文件更改期间重建 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421816/
如果我使用 alter index x rebuild 重建不可用的索引,是否会重新评估之前使用该索引的任何 SQL 的执行计划? 我知道在我使用的数据库版本 - Oracle 10.2.0.4.0
我正在研究 3d 重建。现在当我考虑一对图像时。我有一组对应点。我有我的相机详细信息。例如我有焦点细节,旋转和平移矩阵(4 * 4)。我想在 3D(三角剖分)中投影我的点。因此,据我所知,因子代数非常
从教程中:https://programtalk.com/vs2/?source=python/8176/opencv-python-blueprints/chapter4/scene3D.py 我不
我需要您的帮助和建议。这个问题包括以下几项:某房间的照片,该房间站在严格固定位置的房间内(一个房间围绕轴线旋转)。如何将所有这些图片组合在一起,从而产生一种效果,就像我们用眼睛看到的一样?从一点开始就
嘿那里,以下问题:我在工作中使用一个相当奇怪的 Linux 发行版(Centos 5),它似乎有一个较旧的内核(或者至少在内核中存在一些差异),并且您不能简单地更新它。我需要安装的程序需要一个函数 c
我读了一些关于受限玻尔兹曼机的文章。这些机器的重建能力经过了测试。我了解训练是如何进行的,但不了解重建是如何完成的。有人可以给我一些提示吗? 最佳答案 杰夫·辛顿 (Geoff Hinton) 的演讲
如果轻量级迁移失败,我将尝试重建核心数据数据堆栈,并将用户送回登录屏幕。我正在通过将一对多关系更改为一对一关系来对此进行测试。 起初,我在删除新的 persistentStoreCoordinator
以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,column list 表示字段列表(如:`id`,`order_id`)。 1、创建索引 索引的
当您根据 ListView.builder 和 ListView.separated valueKey = key; return _messages
切换底部导航页面后,我有一个非常烦人的谷歌地图 flutter 重建问题。我已经坚持了最后一次缩放和相机位置,但是每次我进入 map 页面时,小部件都会自行重建。如何预防? 最佳答案 采用 Autom
我是 Python 的新手。我在重建一个错误的 Dataframe 时遇到了麻烦。我的数据框如下所示: df = pd.DataFrame({'col1': ['id 1', 'id 2', 'tes
我正在尝试从 2 个图像中实现 3d 重建。我遵循的步骤是, 1. Found corresponding points between 2 images using SURF. 2. Impleme
// Start with this JSON var initialJson = { "rows": [{ "ID": 123, "Data": 430910, "Ver
在有状态的小部件中,我有一个导航部分,用户可以在其中选择父项,并在子项下方显示。 当我选择父级也可以重建子部件时,但是当我导航抛出父项而不选择一个子部件时,父级也可以重建(这是正常的),但是子部件也可
我有一个网络摄像头,它可以围绕人的头部以给定的角度步长旋转,并为每一步获取一张图片。 我正在寻找一个免费的开源库,该库从获取的图像集开始,使我能够生成代表人头部的 3D 表面,或者至少是定义明确的 3
我想从一行中读取一个字符串,然后将其放入一个变量中,该变量随后用作文件名。该字符串位于 .csv 文件中的第二行末尾。由于不必要的标题,需要删除第一行。还有‘;’旧 .csv 文件中使用的内容需要替换
我正在使用file-embed如此封装: import qualified Data.ByteString as B import qualified Data.ByteString.Internal
我的 makefile 总是重建,不明白为什么.. 这里是: SRC = $(DIR)/my_getnbr.c \ $(DIR)/my_isneg.c \ $(DI
我有一个附带编辑器的 Eclipse 插件。 我添加了更改语法突出显示颜色的首选项,但这些更改仅在我手动重新启动编辑器后才适用。 我通过一个 DefaultDamagerRepairer 实现了语法高
我有一段 php 可以输出 div(取决于数组中有多少个)并为该 div 分配一个 id(即 div_1、div_2)等 我还设置了一个隐藏字段,其中包含输出了多少个 div 的计数(divcount
我是一名优秀的程序员,十分优秀!