第一步:
新建目录library,进入library。在library中创建3个目录,apps,vendor1,vendor2。
在apps中创建main.c文件
#include
#include "module1.h"
#include "module2.h"
int main()
{
module_init();
func1();
module_exit();
return 0;
}
在vendor1中创建exit.c,init.c文件,module1.h
#include
void module_exit()
{
printf("Good bye!\n");
} //exit.c
#include
void module_init()
{
printf("Hello world!\n"); //init.c
}
#ifndef __MODULE1_H
#define __MODULE1_H
void module_init(void);
void module_exit(void);
#endif //module.h
执行gcc exit.c –c –static 生成exit.o
执行gcc init.c –c –static 生成init.o
拷贝exit.o,init.o,module1.h到app目录下
在vendor2目录下创建func1.c,mudule2.h
#include
void func1()
{
printf("Coming function %s\n",__FUNCTION__);
}
#ifndef __MODULE2_H
#define __MODULE2_H
void func1(void);
#endif
执行gcc func1.c –c –static 生成func1.o
拷贝func1.o,module2.h到apps目录下
进入apps目录,执行命令与结果如下
[lingyun@localhost apps]$ gcc main.c func1.o exit.o init.o -o test
[lingyun@localhost apps]$ ./test
Hello world!
Coming function func1
Good bye!
第二步(静态库):
在vendor1目录中使用命令ar -rsv libmodule1.a *.o,将所有.o文件打包。
将libmodule1.a module1.h拷贝到apps目录下
在vendor2目录中使用命令ar -rsv libmodule2.a *.o,将所有.o文件打包。
将libmodule3.a module2.h拷贝到apps目录下
进入apps目录,删除第一步中的.o文件,执行命令
gcc main.c -L. -lmodule1 -lmodule2 -o test
执行./test将会有相同的结果。
-L.表示在当前目录找库文件。
-l表示要连接的库文件。
如果我们刚才没有吧libmodule1.a,module1.h和libmodule2.a,module2.h拷贝到本目录,
编译命令为gcc main.c -I ../vendor1/ -I ../vendor2/ -L ../vendor1 -lmodule1 -L ../vendor2/ -lmodule2 -o test
gcc main.c -I ../vendor1/ -I ../vendor2/ -L ../vendor1 -lmodule1 -L ../vendor2/ -lmodule2 -static -o test
第三步(动态库):
gcc -O -fpic -shared -o libmodule1.so *.c
gcc main.c -I ../vendor1 -I ../vendor2 -L ../vendor1 -lmodule1 -L ../vendor2 -lmodule2 -o test
[lingyun@localhost apps]$ ./test
./test: error while loading shared libraries: libmodule1.so: cannot open shared object file: No such file or directory
执行test时提示错误,因为动态编译的程序是在运行时加载库文件,现在程序找不到库文件。
export LD_LIBRARY_PATH=/home/lingyun/caijie/library/vendor2:/home/lingyun/caijie/library/vendor1:
用环境变量LD_LIBRARY_PATH导出动态库路径。
阅读(1117) | 评论(0) | 转发(0) |