分页: 1 / 1

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

发表于 : 2008-08-21 9:01
cnkilior
有这样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关键字有什么作用?

发表于 : 2008-08-21 9:16
bones7456
1.makefile的问题看这个: viewtopic.php?t=128278&highlight=
2.系统头文件的实现在响应的系统库里面,像math.h里面的东西就在 /lib/libm.so.6 这样的文件里面.
3.这个可以google

发表于 : 2008-08-21 10:19
cnkilior
我现在能帮我自己大致的回答一下第2个问题:

能实现自定义函数共享,但要告诉gcc哪里能找到他的实现。对于系统头文件,gcc知道如何找,用ld就清楚gcc是自动找了,(gcc应该是调用了ld,告诉了他搜索路径的,或文件名)

发表于 : 2008-08-22 18:54
lyre
> 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表示只编译不链接

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

发表于 : 2008-09-01 13:23
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 ,足够搞定大多数问题。

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

发表于 : 2008-09-04 22:27
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

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

发表于 : 2008-09-04 23:00
poet
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了,用那些生成器去了。