[问题]关于将一个C文件分成两个c文件如何编译的问题!

软件和网站开发以及相关技术探讨
回复
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

[问题]关于将一个C文件分成两个c文件如何编译的问题!

#1

帖子 cnkilior » 2008-08-21 9:01

有这样3个文件a.c a.h b.c在同一个文件夹中!
a.c的内容

代码: 全选

#include <stdio.h>
void myprint(char *ch)
{    printf("%s",ch);
}
a.h的内容:

代码: 全选

#include <stdio.h>
void myprint(char *ch);
b.c的内容:

代码: 全选

#include <stdio.h>
#include "a.h"
int main()
{  myprint("abc");
}
-------------------------
我知道用

代码: 全选

gcc a.c b.c
能编译成功。而gcc b.c失败!

------
我想问的是:
1、如果要写一个makefile,该怎么写?是否这样?

代码: 全选

b.o: b.c a.c
2、这里的a.h能不能起到共享自定义函数的作用。更进一步的问题是系统的头文件,内部声明的函数他在那里被实现了?gcc如何了解其实现的位置?
3、extern关键字有什么作用?
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#2

帖子 bones7456 » 2008-08-21 9:16

1.makefile的问题看这个: viewtopic.php?t=128278&highlight=
2.系统头文件的实现在响应的系统库里面,像math.h里面的东西就在 /lib/libm.so.6 这样的文件里面.
3.这个可以google
关注我的blog: ε==3
头像
cnkilior
论坛版主
帖子: 4984
注册时间: 2007-08-05 17:40

#3

帖子 cnkilior » 2008-08-21 10:19

我现在能帮我自己大致的回答一下第2个问题:

能实现自定义函数共享,但要告诉gcc哪里能找到他的实现。对于系统头文件,gcc知道如何找,用ld就清楚gcc是自动找了,(gcc应该是调用了ld,告诉了他搜索路径的,或文件名)
头像
lyre
帖子: 77
注册时间: 2005-06-28 18:08

#4

帖子 lyre » 2008-08-22 18:54

> 1、如果要写一个makefile,该怎么写?是否这样?
> 代码:
> b.o: b.c a.c

代码: 全选

all: a.o b.o
    gcc a.o b.o -o filename -Wall
a.o: a.c
    gcc a.c -o a.o -c -Wall
b.o: b.c
    gcc b.c -o b.o -c -Wall
大致是这样,-c表示只编译不链接
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: [问题]关于将一个C文件分成两个c文件如何编译的问题!

#5

帖子 poet » 2008-09-01 13:23

cnkilior 写了:1、如果要写一个makefile,该怎么写?是否这样?

代码: 全选

b.o: b.c a.c
改成

代码: 全选

b: a.c
就可以了。

如果你有三个文件:a.c, b.c, c.c,要把它编译成 b,那就是:

代码: 全选

b: a.c c.c
一行 Makefile ,足够搞定大多数问题。
头像
CLOCKWORKHEART
帖子: 635
注册时间: 2007-11-05 19:26

Re: [问题]关于将一个C文件分成两个c文件如何编译的问题!

#6

帖子 CLOCKWORKHEART » 2008-09-04 22:27

poet 写了:
cnkilior 写了:1、如果要写一个makefile,该怎么写?是否这样?

代码: 全选

b.o: b.c a.c
改成

代码: 全选

b: a.c
就可以了。

如果你有三个文件:a.c, b.c, c.c,要把它编译成 b,那就是:

代码: 全选

b: a.c c.c
一行 Makefile ,足够搞定大多数问题。
充分利用make的隐晦规则,有点隐晦啊, :em09
Everything that has a beginning has an end.
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: [问题]关于将一个C文件分成两个c文件如何编译的问题!

#7

帖子 poet » 2008-09-04 23:00

CLOCKWORKHEART 写了:
poet 写了:
cnkilior 写了:1、如果要写一个makefile,该怎么写?是否这样?

代码: 全选

b.o: b.c a.c
改成

代码: 全选

b: a.c
就可以了。

如果你有三个文件:a.c, b.c, c.c,要把它编译成 b,那就是:

代码: 全选

b: a.c c.c
一行 Makefile ,足够搞定大多数问题。
充分利用make的隐晦规则,有点隐晦啊, :em09
make 的隐含规则就是为了方便使用的。如果你只有一个 hello.c 甚至都根本不需要写 makefile,make hello就可以了。其实掌握make隐含规则能够应付绝大多数的简单应用或者测试应用。——真正的大项目也不可能自己写Makefile了,用那些生成器去了。
回复