在makefile中写入依赖项,用makefile

2024-01-01

基于一些SO问题——以及发现的一些进一步的参考——,我正在尝试构建一个能够:

  • 查找,给定目录$(SRC), the .cpp待编译的文件;
  • 编译.cpp,生产.o物体;
  • 产生.so每个共享对象.o以前编译的。

为了实现这一点,make 文件应该做的是:

  • 查找,给定目录$(SRC), the .cpp待编译的文件;
  • 为每个构建依赖项列表.cpp using -MM编译器标志;
  • 使用注释/添加每个依赖项$(eval ...);
  • 评估/解决找到的每个依赖关系,产生.o and .so files.

到目前为止我有什么: 除了让它发挥作用之外,我已经能够完成所有事情(: 我收到的错误表明,不知何故,有一个空标签''作为依赖:

$ 使使:*没有制定目标的规则', needed by /home/rubens/bin/label.o'。停止。

所以,这是我还无法运行的 makefile:

# Directories
SRC := process init
BIN := $(HOME)/bin

LIB := watershed
LIBPATH := $(WATERSHED)/lib
INC := $(WATERSHED)/include $(XERCES)/include

# Paths
MPICPP := mpic++
SOURCES := $(shell find $(SRC) -name '*.cpp')
OBJECTS := $(addprefix $(BIN)/, $(notdir $(SOURCES:.cpp=.o)))
SHARED := $(OBJECTS:.o=.so)

# Flags 
CFLAGS := -std=c++0x -O2 -Wall -fPIC
CFLAGS += $(foreach inc, $(INC), -I $(inc))
LFLAGS :=
LFLAGS += $(foreach lib, $(LIB), -l $(lib))
LFLAGS += $(foreach path, $(LIBPATH), -L $(lib))

# Rules
$(SHARED): | bindir
%.o:
        @echo $@ -- [$<][$^][$*]
        @echo $(MPICPP) $(CFLAGS) -c $< -o $@

%.so: %.o
        @echo $(MPICPP) $(LFLAGS) -shared $< -o $@

bindir:
        @mkdir -p $(BIN)

# Utilities
.PHONY: all clean
all: $(SHARED)
clean:
        @rm -f $(OBJECTS) $(SHARED)

# Dependencies
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
        $(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//')
endef
$(foreach src, $(SOURCES), $(eval $(call dependencies, $(src))))

到底错误在哪里: 这似乎是由依赖项生成步骤引起的,因为当我删除任何空行时,将输出通过管道传输到grep, 如下:

define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
        $(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//' | \
        grep -v ^$)
endef

该错误以某种方式涉及到一个空的依赖项列表;我可以看到列表实际上是空的echo是有规则的%.o:-- 唯一不为空的变量是$@ and $*.

/home/rubens/bin/label.o -- [][][/home/rubens/bin/label]

mpic++ -std=c++0x -O2 -Wall -fPIC -I /home/rubens/libwatershed/include -I /home/rubens/xerces-c-3.1.1/include -c -o /home/rubens/bin /标签.o

mpic++ -l 分水岭 -L -shared /home/rubens/bin/label.o -o /home/rubens/bin/label.so

非常非常欢迎任何有关解决此问题的更好方法的建议;然而,我真的很想在使用类似的东西之前完成这个makefile的编写Cmake or Scons.


-MM已经生成了对 a 的依赖关系Makefile格式,因此您可以通过生成每个的依赖关系来简化它*.cpp到同一个文件中,然后只需执行-include $(DEPS_FILE)。这可能比使用 eval 更易于维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在makefile中写入依赖项,用makefile 的相关文章

随机推荐

  • 在哪里放置模型数据和行为? [tl;博士;使用服务]

    我正在使用 AngularJS 来完成我的最新项目 在文档和教程中 所有模型数据都放入控制器范围内 我知道它必须可供控制器使用 因此必须在相应的视图中 但我认为该模型实际上不应该在那里实施 例如 它可能很复杂并且具有私有属性 此外 人们可能
  • 将文本框绑定到comboBox.SelectedItem 的属性

    我正在使用 winforms 并且有一个代表 IQueryable 的组合框 组合框下方是一系列文本框 我希望将它们绑定到组合框中当前选择的文本框 这是我的代码 public partial class TestForm Form publ
  • 如何访问 keras 中单个自定义损失函数的所有输出

    我正在尝试重现中提出的网络架构本出版物 https www sciencedirect com science article pii S0031320319302031在张量流中 作为一个完全的初学者 我一直在使用本教程 https ww
  • 如何在使用 Component Creator 构建的 Joomla 3.x 组件的一个视图中包含多个模型

    Joomla 组件使用 MVC 模型 Component Creator 是一种广泛使用的工具 其付费级别支持通过 SQL 导入创建多表视图 此外 开发人员根据 Joomla 文档从头开始构建组件 我想构建一个高级组件 充当 仪表板 显示来
  • Python:从字符串中提取多个浮点数

    请原谅我 我是 Python 新手 给定一个以不确定长度的浮点数开头并以相同长度结尾的字符串 我如何将它们都提取到一个数组中 或者如果只有一个浮点数 则只有一个 例子 38 00 SALE 15 20 69 99 我想返回 38 00 15
  • 计算 AP 的距离,包括信噪比

    出于某种原因 我和一个朋友正在讨论根据从设备获取的信息 RSSI 频率 SNR 等 计算您自己 笔记本电脑 手机等 与 AP 之间的距离 因此 在花了一些时间研究三边测量 三角测量和自由空间路径损耗之后 在一些博客文章和 wiki 的帮助下
  • bootstrap-affix :affix 下面的 Div“跳”到顶部。如何让它平滑地向后滚动?

    已经使用 bootstrap 几天了 并对它提供的功能感到惊讶 一直在尝试拥有某种 标题 当用户向下滚动时将其固定在顶部 您可以在这里找到我当前的工作 http mp3dj free fr affix site http mp3dj fre
  • 比较 SynchronizationContext

    如何比较 SynchronizationContext 看来同一个Dispatcher在使用BeginInvoke时可以创建不同的SynchronizationContext 当我深入研究两个 不相等的 上下文时 我发现调度程序线程 ID
  • 在记事本++中创建新快捷方式

    我正在尝试在记事本 中添加快捷方式或按钮来调用我当前正在编辑的文件上的外部程序 例如 假设我有程序 analyzer jar 我想在记事本 中创建一个按钮 或快捷方式 来直接运行命令 cmd K java jar analyzer jar
  • 在 AWS EC2 上添加新的 Spark 工作线程 - 访问错误

    我有现有的正在运行的 Spark 集群 它是通过以下方式启动的spark ec2脚本 我正在尝试按照说明添加新的从站 停止集群 在 AWS 控制台上 在其中一个从属设备上 启动更多这样的操作 启动集群 尽管新实例已添加到同一安全组 并且我可
  • Y 轴中带有长标签的 Recharts 水平条形图的动态高度

    如果 YAxis 中的标签太长 如何动态更改 Recharts 中的 ResponsiveContainer 的高度 这是我的代码
  • 错误:打开模拟器时,在 Windows 8 上找不到抛出的模拟器图像 (avds)

    我正在 ionic 框架中制作一个 cordova 应用程序 我想在模拟器 somfired 命令中测试它ionic emulate android它引发了以下错误 运行命令 ionic emulate android 时 Git Bash
  • ControlSend 使用 SetKeyDelay, 0, 0 时随机发送错误字符(修改和未修改)

    我正在自我回答这个问题 因为我在互联网上看到过这个问题 但几乎没有有用的答案 而且在 Stack Overflow 上也绝对找不到我能找到的解决方案 示例代码 考虑一下这段代码 它只写了几行 shell 命令 0 SetKeyDelay 0
  • 允许多个不同形状的接口作为 TypeScript 返回类型

    我有一个函数 它接受一些参数并生成将传递到外部进程的对象 由于我无法控制最终需要创建的形状 因此我必须能够为我的函数采用一些不同的参数并将它们组装成适当的对象 这是一个非常基本的示例 展示了我遇到的问题 interface T1A type
  • BuildHTTPClient 无法获取构建定义步骤?

    我们使用 BuildHTTPClient 以编程方式创建构建定义的副本 更新内存中的变量 然后将更新的对象保存为新定义 我在用着Microsoft TeamFoundation Build2 WebApi BuildHTTPClient h
  • 在android中显示栏之间的空格

    如何在android中提及条形图的条形之间的空格 Thanks in advance 上面的图片会让你清楚我的疑问 即 蓝色条实际上不适合相应的 x 轴值 这里是 Ord 1 Ord 2 Ord 3 Ord 4 我需要显示这些带有 x 轴值
  • OpenCV 2.3 中的 VideoCapture 问题

    我使用时遇到问题视频截取用于打开 MPEG 视频文件的类 代码已正确编译 但是 在运行期间 它无法打开文件并给出以下警告消息 警告 打开文件时出错 modules highgui src cap ffmpeg impl hpp 477 仅当
  • 使用 JNI 从单独的线程调用静态 Java 方法

    我正在尝试在 android 中使用 JNI 来创建一个函数指针 我正在使用的本机库将其调用转发给 java When initializeStateController被调用 使用创建一个新线程pthread create每当状态控制器的
  • 使用 bash shell 脚本替换文件中的字符串

    我想在文件中找到一个字符串 进行一些操作并将该字符串放回文件中 下面给出的是我需要的示例 cat sample txt TimeStamp gt 123456 Name gt ABC Mail gt email protected cdn
  • 在makefile中写入依赖项,用makefile

    基于一些SO问题 以及发现的一些进一步的参考 我正在尝试构建一个能够 查找 给定目录 SRC the cpp待编译的文件 编译 cpp 生产 o物体 产生 so每个共享对象 o以前编译的 为了实现这一点 make 文件应该做的是 查找 给定