关于makefile

parjing 2013-12-27 03:44:59
工程项目:有多个模块组成,每个模块都有相应的.c、.h文件,都有相应的makefile文件,每个模块将

相应的.c生成.O文件,最后生成一个.a库文件:最后有一个应用模块将各个模块的.a文件生成一个执行

目标文件。例如:1、总的模块称APP模块,最后生成执行文件的模块;子模块有N多个;

//App.c
#include "lib1.h"
#include "lib2.h"

void main() {
//test lib1
a = 3;
test1Fun();

//test lib2
test2Fun();
}

2、其中有一个模块称lib1,这个模块有个lib1.c与lib1.h:
//lib1.c:

int a = 0;

void test1Fun() {
int i;
i = 2
}
//lib1.h

extern int a;
extern void test1Fun();

lib1 的makefile 能生成lib1.a文件,在App.c中测试“//test lib1”编译也能通过。无错误

3、有另一个模块lib2,
// lib2.c
#include "lib1.h"

void test2Fun() {
a = 5;
}

//lib2.h

extern void test2Fun();
这时通过相应的makefile可能生成lib2.a,也无出错误,但当在App.c上加上“test lib2”的测试语句

时,这时用make去生成APP模块的执行文件会出错会提示lib2.a(li2.o):Infunction

'test2Fun':test2Fun.c(.text + 0x10):undefined reference to 'a';
项目的文件系统可以看成这样的:
Project
|---App
| |---sourceFiles
| |---App.c
|---lib1
| |---HeadFiles
| |---lib1.h
| |---sourceFiles
| |---lib1.c
| |---build
| |---makefile
|---lib2
| |---HeadFiles
| |---lib2.h
| |---sourceFiles
| |---lib2.c
| |---build
| |---makefile
其中makefile我不是那么熟,是在其它的程序搬过来,它能够将lib1与lib2生成相应的.a文件,lib1\2

两个makeflie文件相似,只是将.c与.h生成相应的.a,而App中的makefile可以包含lib1/2.a与app.c文

件去生成执行目标文件。makefile文件做好了文件路径的包含。
现在是:我在APP中的makefile中只包含lib2.a去测试“test lib1”那段语句时,是没有错的,而包含

lib1/2.a,同时不加测试语句"test lib2",也没有出错,但一加上“test lib2”测试语句就会出错:提

示lib2.a(li2.o):Infunction 'test2Fun':test2Fun.c(.text + 0x10):undefined reference to 'a';
,这是因为lib2的makefile中没有加入lib2.a吗?若是这样为什么单独去make lib2中的makefile时,

为什么没有出错呢。
...全文
270 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuzhutuzhu 2014-03-12
  • 打赏
  • 举报
回复
Makefile说白了就是把编译的语句放在一个文件中,然后一键执行。 所以建议LZ先在命令行中将上述的几个文件编译好,然后将编译的几条命令整到Makefile文件中就可以了。
疯狂的蘑菇 2014-03-04
  • 打赏
  • 举报
回复
看看那个一起来写MAKEFILE,我的那个资源里有那个文档
zhxianbin 2014-02-12
  • 打赏
  • 举报
回复
引用 7 楼 Ken86 的回复:
引用 6 楼 zhxianbin 的回复:
引用 5 楼 Ken86 的回复:
有见一楼。一楼好。
神马意思???
又见一楼,一楼总是那句经典的回复。
木有办法,那确实是一本经典
Ken86 2014-02-12
  • 打赏
  • 举报
回复
引用 6 楼 zhxianbin 的回复:
引用 5 楼 Ken86 的回复:
有见一楼。一楼好。
神马意思???
又见一楼,一楼总是那句经典的回复。
zhxianbin 2014-02-11
  • 打赏
  • 举报
回复
引用 5 楼 Ken86 的回复:
有见一楼。一楼好。
神马意思???
Ken86 2014-02-11
  • 打赏
  • 举报
回复
有见一楼。一楼好。
masterz 2013-12-29
  • 打赏
  • 举报
回复
推荐一本书Managing Projects with GNU Make by Robert Mecklenburg
zhxianbin 2013-12-28
  • 打赏
  • 举报
回复
google 跟我一起写makefile
半字节 2013-12-28
  • 打赏
  • 举报
回复
对于楼主: 若是这样为什么单独去make lib2中的makefile时, 为什么没有出错呢。 解释:编译库文件的时候,看到a的声明就足够了。 但生成app时,只看到声明是不够的。 也就是说,编译库文件,编译过了就行。 编译app时,必须链接也过了才可以。 你的lib2中的a实际是在lib1中的,所以 你要测试的lib2,必须带上lib1才可以。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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