网上找了很多资料,感觉都有不对的地方,总结了几个资料,成功运行。 一.制作静态链接库 两个c文件:bar.c,foo.c以及一个头文件foobar.h // bar.c #include "foobar.h" char * bar(void) { printf("This is bar! library1 is called\n"); return ("bar"); } //foo.c #include "foobar.h" char * foo(void) { printf("This is foo!library2 is called!\n"); return ("foo"); } //foobar.h #ifndef _FOOBAR_H_ #define _FOOBAR_H_ #include <stdlib.h> #include <string.h> #include <stdio.h> extern char *foo(void); extern char *bar(void); #endif #gcc -c -o foo.o foo.c #gcc -c -o bar.o bar.c #ar rcs libfoobar.a foo.o bar.o 生成库文件libfoobar.a 这基于PC平台的,如果是对于嵌入式平台的构建静态链接库而言,过程也是完全一样,唯一 需要改变的可能是所用的工具名称。比如,如果要是为ARM-Linux构建静态库,那么可能需 要使用arm-linux-ar。这里还有一个工具是nm,它可以用来取得目标文件的符号(symbol)信 息。这里,nm打印出了libfoobar.a中的两个符号:foo和bar。这两个符号表示的都是函数 ,因此它们的符号值为0,符号类型为T(text,即表示该符号位于代码段)。最后一列给出 的是符号的名称。 #nm libfoobar.a foo.o: 0000000000000000 T foo U puts bar.o: 0000000000000000 T bar U puts 二.使用静态链接库 编辑main.c //main.c #include <stdio.h> #include "foobar.h" int main() { bar(); foo(); return 0; } 编译生成对应的目标文件: #>gcc -c -I/home/simple/libtest/test main.c 生成可执行文件: #>gcc -o main -L/home/simple/libtest/test main.o libfoobar.a 其中-I/home/simple/libtest/test和-L/home/simple/libtest/test是通过-I和-L指定对应的头文件和库文件的路径。libstr.a是对应的静态库的名称。这样对应的静态库已经编译到对应的可执行程序中。执行对应的可执行文件便可以对应得函数调用的结果。 最后,运行 ./main 结果: This is bar!Library1 is called This is foo!Library2 is called (责任编辑:IT) |