多文件编译库文件推荐.pptVIP

  • 2
  • 0
  • 约4.94千字
  • 约 26页
  • 2018-04-28 发布于湖北
  • 举报
多文件编译

多文件编译头文件库文件 李岚 多文件编译 将多个c文件编译成可执行文件 gcc stackfunc.c stackmain.c -o main 上面的过程还可以使用如下步骤替代 gcc -c stackfunc.c gcc -c stackmain.c gcc stackmain.o stackfunc.o -o main * 用nm命令查看目标文件的符号表,会发现stackmain.o中有未定义的符号push、pop、is_empty、putchar, nm stackmain.o U is_emptyT main U pop U push U putchar nm stackfunc.oT is_empty 0000002a T popT pushC stackD top Push pop is_empty在stackfunc.o中实现了,链接生成可执行文件时可以做符号解析,而putchar是libc的库函数,在可执行文件stackmain中仍然是未定义的,要在程序运行时做动态链接 * 刚刚程序完美吗?(头文件) gcc -c stackmain.c -Wall stackmain.c: In function ‘main’: stackmain.c:8: warning: implicit declaration of function ‘push’ stackmain.c:12: warning: implicit declaration of function ‘is_empty’ stackmain.c:13: warning: implicit declaration of function ‘pop’ * 为什么出现上面的警告?(头文件) 由于编译器在处理函数调用代码时没有找到函数原型,只好根据函数调用代码做隐式声明,把这三个函数声明为: int push(char); int pop(void); int is_empty(void); * 在main中声明函数原型 extern void push(char);//函数声明extern可加可不加 extern char pop(void); extern int is_empty(void); extern int top;//变量声明extern一定要加 这样即没有警告 root@ubuntu:/home/li/share/CodeTest/2linkertest/2# gcc stackfunc.c stackmain.c -o main -Wall * 外部链接(头文件) 如果把stackmain.c和stackfunc.c链接在一起,如果push在stackmain.c和stackfunc.c中都有声明(在stackfunc.c中的声明同时也是定义),那么这些声明指的是同一个函数,链接之后是同一个GLOBAL符号,代表同一个地址。函数声明中的extern也可以省略不写,不写extern的函数声明也表示这个函数具有External Linkage。 * 头文件 将刚才的stackmain.c分成stacklilan.h和stackmain.c 编译 root@ubuntu:/home/li/share/CodeTest/2linkertest/3# gcc stackfunc.c stackmain.c -o main -Wall * 静态库 把stackfunc.c拆成4个程序文件 gcc -c stack/stack.c stack/push.c stack/pop.c stack/is_empty.c 生成库文件 ar rs libstacklilan.a stack.o push.o pop.o is_empty.o ar: creating libstacklilan.a 或者 ar r libstacklilan1.a stack.o push.o pop.o is_empty.o ar: creating libstacklilan1.a ranlib libstacklilan1.a * 静态库 gcc main.c -L. -lstacklilan -Istack -o main -L选项告诉编译器去哪里找需要的库文件,-L.表示在当前目录找。 -lstacklilan告诉编译器要链接libstacklilan库 -I选项告诉编译器去哪里找头文件(.h)。 编译器会在搜索路径以及-L选项指定的路径中查找用-l选项指定的库,比如-lstackl

文档评论(0)

1亿VIP精品文档

相关文档