关于makefile: No rule to make target `test.o', needed by `ctest'. Stop.

shayne000 2018-07-26 10:10:18
写了makefile但是报错说没有可以生成目标test.o的规则
目录结构:
代码在./src中头文件在./include中 希望生成的.o在./obj里面 生成的可执行程序在./
A.cpp成功生成了A.o 不知道为什么test.cpp出错了
makefile如下:
 
1 sdir=./src/
2 odir=./obj/
3 idir=./include/
4 srcd=$(wildcard ./src/*.cpp)
5 src=$(notdir $(srcd))
6 obj=$(patsubst %.cpp,%.o,$(src))
7 target=ctest
8 $(target):$(odir)$(obj)
9 g++ $^ -o $@
10 $(odir)%.o:$(sdir)%.cpp
11 g++ -c $< -o $@ -I$(idir)
12 .PHONY:clean
13 clean:
14 rm $(odir)$(obj) $(target) -f

...全文
2495 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
elibu 2018-07-28
  • 打赏
  • 举报
回复
我知道问题了:obj不带路径,到第8行时只是一个替换,test.o没有路径
shayne000 2018-07-27
  • 打赏
  • 举报
回复
引用 1 楼 jklinux 的回复:
问题应是在8 $(target):$(odir)$(obj)这里, 最后一个test.o在没有完整路径的
$(odir)$(obj)不是给每个$(obj)都添加路径$(odir)的意思吗,请问一下大佬要怎么改才能正确实现呢
jklinux 2018-07-27
  • 打赏
  • 举报
回复
引用 3 楼 shayne000 的回复:
引用 1 楼 jklinux 的回复:
问题应是在8 $(target):$(odir)$(obj)这里, 最后一个test.o在没有完整路径的
$(odir)$(obj)不是给每个$(obj)都添加路径$(odir)的意思吗,请问一下大佬要怎么改才能正确实现呢


一般情况下,在源码的每个子目录里都有一个Makefile, 负责把整个子目录里的.o文件打包成一个文件。在源码根目录里的Makefile负责调用子目录里的Makefile, 并把每个子目录里的打包文件链接成一个程序
zhxianbin 2018-07-27
  • 打赏
  • 举报
回复
用 echo 把目标、依赖打印出来看看
shayne000 2018-07-27
  • 打赏
  • 举报
回复
目前解决方法:在.cpp替换为.o时就直接加上路径
  7 obj=$(patsubst %.cpp,$(odir)%.o,$(src))#将.cpp文件名替换为.o
8 target=ctest
9
10 $(target):$(obj)
11 g++ -g $^ -o $@
shayne000 2018-07-27
  • 打赏
  • 举报
回复
引用 5 楼 jklinux 的回复:
引用 3 楼 shayne000 的回复:
[quote=引用 1 楼 jklinux 的回复:]
问题应是在8 $(target):$(odir)$(obj)这里, 最后一个test.o在没有完整路径的
$(odir)$(obj)不是给每个$(obj)都添加路径$(odir)的意思吗,请问一下大佬要怎么改才能正确实现呢


一般情况下,在源码的每个子目录里都有一个Makefile, 负责把整个子目录里的.o文件打包成一个文件。在源码根目录里的Makefile负责调用子目录里的Makefile, 并把每个子目录里的打包文件链接成一个程序[/quote]这样啊
shayne000 2018-07-27
  • 打赏
  • 举报
回复
引用 4 楼 zhxianbin 的回复:
用 echo 把目标、依赖打印出来看看
echo显示确实没有给第二个目标加上路径
jklinux 2018-07-26
  • 打赏
  • 举报
回复
问题应是在8 $(target):$(odir)$(obj)这里, 最后一个test.o在没有完整路径的
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 Node.js作为一个运行环境,其基础是Chrome的V8引擎,它最突出的优势在于能够支持JavaScript代码在服务器端执行,从而为网络应用程序创造了一个全新的执行平台。在Node.js生态中,文件系统的相关操作由fs模块承担,而fs.readFile作为其中的关键方法,专门用于实现文件内容的获取。本文旨在全面阐释fs.readFile方法的相关信息,包括其功能说明、语法结构、参数配置、应用范例以及源代码实现,以供那些需要在Node.js环境中进行文件操作的程序员参考。 fs.readFile方法具备异步特性,意味着它在执行文件读取任务时不会中断当前程序的运行流程,使得程序的其他部分能够同步执行。该方法的工作流程是:一旦调用,Node.js会立即反馈执行信号,然后在后台线程中执行文件读取任务。当文件读取任务完成后,Node.js会通过一个预设的回调函数来处理读取结果或识别错误。 fs.readFile方法的语法结构如下: fs.readFile(path[, options], callback) - path:一个必须的参数,其数据类型可以是字符串、Buffer或Uint8Array,用于指示文件的具体位置或文件描述符。 - options:一个可选参数,形式为一个对象,用于设定文件的编码格式及打开模式。该对象中可以包含encoding(字符编码,默认值为null,此时返回Buffer对象)和flag(文件打开模式,默认值为r,代表只读模式)。 - callback:一个必须的回调函数,在文件读取任务结束后被触发。若读取过程中出现错误,err参数将包含错误详情,否则为n...

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧