LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4130|回复: 5

本人业余初学编程,碰到个简单问题,望有大虾帮助。

[复制链接]
发表于 2010-8-23 11:39:40 | 显示全部楼层 |阅读模式
.
|-- Makefile
|-- callbacks
| |-- callbacks.c
| `-- callbacks.h
|-- gui.glade
|-- h
| `-- target.h
`-- main.c

这是我目录下的源文件摆放顺序,我将所有的头文件定义单独放在了h文件夹下,然后把所有回调函数放在了callbacks文件夹下。

以下是我的makefile

CC=gcc
SRCS=main.c callbacks/callbacks.c
PROG_NAME=main
INCS=h/target.h callbacks/callbacks.h
OBJS=${SRCS:.c=.o}
#从xx.c 文件得到 xx.o 文件
LIBS=gtk+-2.0
#----------------------------------用户修改区域 结束
CFLAGS=`pkg-config --cflags ${LIBS}` -g -Wall
#指代编译程序时使用到的一些编译选项, -g 表示生成调试信息以供GDB使用
LDFLAGS=`pkg-config --libs ${LIBS}` -g -Wall
#用来指代进行程序连接时使用到的一些选项
#-----------------------------------

all: ${PROG_NAME}
##这一句开始,Makefile就开始使用 目标:依赖 的关系来处理真正的程序编译而它们下边以 TAB 键开始的行就是满足依赖关系后要运行的程序了
${PROG_NAME}{OBJS}
${CC} -o ${PROG_NAME} ${OBJS} ${LDFLAGS}
#注意:上边”${CC}" 的前边有一个TAB键,而不是空格

${OBJS}{INCS}
##如果有头文件修改则自动编译源文件
.c.o:
${CC} -c $< ${CFLAGS}
#当遇到一个 .c 文件,将使用这条命令将.c文件编译为.o文件 命令中$<用来代替对应的.c 文件的文件名。(通配符?)
clean:
rm -f *.o ${PROG_NAME}
rebuild: clean all


然后编译后出现如下情况:gcc: callbacks/callbacks.o: No such file or directory


我现在一直不清除如何分开头文件和头文件相关的.c文件的摆放顺序(可能我描述这个问题也有问题),关于这个的定义部分我看一些教程也是一知半懂,我只是想把这个程序写得有条例一些,各种模块函数调用都用文件夹分类等等,但我不知道如何在makefile中组织这些关系。这个程序里的callbacks.c 在callbacks文件夹里,main.c中调用了callback.h,同样callback.h也在callbacks文件夹里。
main.c的开头是这样:
#include "h/target.h"
#include "callbacks/callbacks.h"

程序本身很简单,我把callbacks.h和callbacks.c和main.c放在同一目录下都能通过。


希望有达达明白我这个半吊子描述的问题。。。我也不知道怎么说清除了。。呵呵。。
发表于 2010-8-23 16:46:27 | 显示全部楼层
make里不用管头文件.

应该是make文件规则有问题没编译callbacks文件下的源文件吧,楼主重跑一下出错了看看callbacks目录下是不是没有callbacks.o这个文件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-23 17:18:11 | 显示全部楼层
没有。。只有在main.c目录下有callbcaks.o
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-23 17:29:35 | 显示全部楼层
哦 知道了 我的问题应该属于:多目录makefile编译规范
回复 支持 反对

使用道具 举报

发表于 2010-8-24 09:31:48 | 显示全部楼层
其实 Makefile 不用整那么复杂。

depend 的问题用 makedepend 整即可。

makefile 本身只需要必须的内容,楼主的可以修改成:
  1. LIBS=gtk+-2.0
  2. SRCS=main.c callbacks/callbacks.c
  3. CFLAGS=`pkg-config --cflags $(LIBS)` -g -Wall
  4. LDFLAGS=`pkg-config --libs $(LIBS)`
  5. all: main
  6. main: $(SRCS)
  7. depend:
  8.     makedepend -- $(CFLAGS) -- $(SRCS)
  9. # DO NOT DELETE THIS LINE -- make depend depends on it.
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-26 07:55:24 | 显示全部楼层
谢谢楼上几位热心帮助,所提出方法我也试过了,手工编写makefile我还没入门吧,我最后用automake解决了,呵呵。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表