+ -
当前位置:首页 → 问答吧 → [原创]Ubuntu 中学习 C/C++ 编程基础入门教程

[原创]Ubuntu 中学习 C/C++ 编程基础入门教程

时间:2010-08-23

来源:互联网

.
|-- 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放在同一目录下都能通过。


希望有达达明白我这个半吊子描述的问题。。。我也不知道怎么说清除了。。呵呵。。

作者: formylove2   发布时间: 2010-08-23

SRCS=main.c callbacks/callbacks.c
OBJS=${SRCS:.c=.o}
所以
OBJS=main.o callbacks/callbacks.o

INCS=h/target.h callbacks/callbacks.h
${OBJS}:${INCS}
所以
main.o callbacks/callbacks.o:h/target.h callbacks/callbacks.h

嗯,这样看你觉得对吗?

main.o应该需要main.c,callbacks.o应该需要callback.c,对吧?

你前面定义的SRC在后面编译的时候好像没用到哦?是不是应该${OBJS}:${SRCS}然后${SRCS}:${INCS}呢?

你可以试着把所有宏全部展开来,然后看看究竟哪里出了错。

Good luck!

作者: neil.sun   发布时间: 2010-08-23

这个makefile 一定要手写吗? 不能用autotool吗,一般随便一个几M的程序makefile 都几千行了 那应该不会是一行行写的吧 是不是有什么自动生成工具阿??!!!

作者: zhoucga   发布时间: 2010-08-23

注意gcc的-I参数,-I指定头文件搜索目录
一般我都是用ide的

作者: fanhe   发布时间: 2010-08-24

.
|-- 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放在同一目录下都能通过。


希望有达达明白我这个半吊子描述的问题。。。我也不知道怎么说清除了。。呵呵。。

作者: formylove2   发布时间: 2010-08-23

SRCS=main.c callbacks/callbacks.c
OBJS=${SRCS:.c=.o}
所以
OBJS=main.o callbacks/callbacks.o

INCS=h/target.h callbacks/callbacks.h
${OBJS}:${INCS}
所以
main.o callbacks/callbacks.o:h/target.h callbacks/callbacks.h

嗯,这样看你觉得对吗?

main.o应该需要main.c,callbacks.o应该需要callback.c,对吧?

你前面定义的SRC在后面编译的时候好像没用到哦?是不是应该${OBJS}:${SRCS}然后${SRCS}:${INCS}呢?

你可以试着把所有宏全部展开来,然后看看究竟哪里出了错。

Good luck!

作者: neil.sun   发布时间: 2010-08-23

这个makefile 一定要手写吗? 不能用autotool吗,一般随便一个几M的程序makefile 都几千行了 那应该不会是一行行写的吧 是不是有什么自动生成工具阿??!!!

作者: zhoucga   发布时间: 2010-08-23

注意gcc的-I参数,-I指定头文件搜索目录
一般我都是用ide的

作者: fanhe   发布时间: 2010-08-24

.
|-- 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放在同一目录下都能通过。


希望有达达明白我这个半吊子描述的问题。。。我也不知道怎么说清除了。。呵呵。。

作者: formylove2   发布时间: 2010-08-23

SRCS=main.c callbacks/callbacks.c
OBJS=${SRCS:.c=.o}
所以
OBJS=main.o callbacks/callbacks.o

INCS=h/target.h callbacks/callbacks.h
${OBJS}:${INCS}
所以
main.o callbacks/callbacks.o:h/target.h callbacks/callbacks.h

嗯,这样看你觉得对吗?

main.o应该需要main.c,callbacks.o应该需要callback.c,对吧?

你前面定义的SRC在后面编译的时候好像没用到哦?是不是应该${OBJS}:${SRCS}然后${SRCS}:${INCS}呢?

你可以试着把所有宏全部展开来,然后看看究竟哪里出了错。

Good luck!

作者: neil.sun   发布时间: 2010-08-23

这个makefile 一定要手写吗? 不能用autotool吗,一般随便一个几M的程序makefile 都几千行了 那应该不会是一行行写的吧 是不是有什么自动生成工具阿??!!!

作者: zhoucga   发布时间: 2010-08-23

注意gcc的-I参数,-I指定头文件搜索目录
一般我都是用ide的

作者: fanhe   发布时间: 2010-08-24