关于makefile
工程项目:有多个模块组成,每个模块都有相应的.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时,
为什么没有出错呢。