菜鸟紧急求助:gcc下的多源文件makefile

Scorpiour 2011-10-09 11:26:37
以前一直用vc写程序所以从来没注意过,最近因为需要用gcc写了一个c的程序,结果遇到makefile的问题让我一个头两个大

简单来说就是程序包含了若干个源文件
f1.c f2.c f3.c
以及一个头文件f.h

头文件包括了所有的函数声明,结构体声明。

结果在编译的时候遇到如下问题:

1. undefined reference

无法调用其它源文件中的函数
下面是我的makefile

test.exe : f1.o f2.o f3.o
gcc -o f1.o f2.o f3.o
f1.o : f1.c f.h
gcc -c f1.c f.h
f2.o : f2.c f.h
gcc -c f2.c f.h
f3.o : f3.c f.h
gcc -c f3.c f.h


2.自定义结构体被识别为语法错误
head file中的定义

typedef struct user_data
{
char Name[NAME_LEN];
char ID[ID_LEN];
char Password[PW_LEN];
}DATA,*pDATA;

typedef struct data_list
{
pDATA User_Data;
data_list * Prev;
data_list * Next;
}DATA_LIST,*pDATA_LIST;

/* ... */

pDATA GetUserData(pDATA_LIST);


所有在头文件使用了自定义struct的地方都会报错

然后将其缩减为诸如

[code=C]\C++
typedef struct user_data DATA,*pDATA;
typedef ...


struct user_data
{
...
};

[/code]

也不行。。

真的是完全搞不清楚问题所在,以前用vc的时候从来没遇到类似问题。。。

在此真是感谢各位大大了

...全文
129 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scorpiour 2011-11-01
  • 打赏
  • 举报
回复
谢谢各位了!问题解决,结帖!
qq120848369 2011-10-09
  • 打赏
  • 举报
回复
f1.o : f1.c f.h
gcc -c f1.c f.h

楼主,你发明的.h参与编译的。
Scorpiour 2011-10-09
  • 打赏
  • 举报
回复
没有太明白楼上大大的意思。。。咱是刚刚接触gcc。。完全两眼一摸黑。。。
only_lonely 2011-10-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loaden 的回复:]

推荐使用CMake,一个文本文件就搞定了。
[/Quote]
惭愧,惭愧,一直处于手写makefile的阶段,一个稍微大一点的工程,光makefile就要累的半死
only_lonely 2011-10-09
  • 打赏
  • 举报
回复
设置一下输出的程序名,默认gcc输出的名字是a.out
only_lonely 2011-10-09
  • 打赏
  • 举报
回复
test.exe : f1.o f2.o f3.o
gcc -o f1.o f2.o f3.o
老邓 2011-10-09
  • 打赏
  • 举报
回复
推荐使用CMake,一个文本文件就搞定了。
jcback 2011-10-09
  • 打赏
  • 举报
回复
test : f1.o f2.o f3.o
gcc -o test f1.o f2.o f3.o
f1.o : f1.c f.h
gcc -g -c f1.c
f2.o : f2.c f.h
gcc -g -c f2.c
f3.o : f3.c f.h
gcc -g -c f3.c
clean :
rm test f1.o f2.o f3.o
matrixcl 2011-10-09
  • 打赏
  • 举报
回复
c程序的话应该改成这样吧?


typedef struct data_list
{
pDATA User_Data;
struct data_list * Prev;
struct data_list * Next;
}DATA_LIST,*pDATA_LIST;


据我说所知,c中data_list不是一个类型名,struct data_list才是。
c++中data_list是类型名。
modicum_lf 2011-10-09
  • 打赏
  • 举报
回复

第一行的 -o 去掉 !
然后 不要加 .h 文件 !

建议看看linux makefile的语法 !

老邓 2011-10-09
  • 打赏
  • 举报
回复
project(TestCMD)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

使用CMake的话,这几行就搞定你的工程了!
不管是GCC,还是VC,只要在命令行下执行:
cmake .
make
即可。
zhongrihan2008 2011-10-09
  • 打赏
  • 举报
回复
f1.o : f1.c f.h
gcc -c f1.c f.h

楼主,你发明的.h参与编译的。

呵呵,这句话,LZ要好好体会哦!!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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