文章目录
一、可执行程序的组装
1.用gcc生成静态库和动态库
(1)编译生成子程序 hello.h、hello.c 和 main.c
创建目录:
mkdir test1
cd test1
编译三个程序:
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
hello.c
#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
(2)将 hello.c 编译成.o 文件
输入命令的得到hello.o 文件
gcc -c hello.c
(3)由.o 文件创建静态库
输入命令创建静态库文件
ar -crv libmyhello.a hello.o
(4) 在程序中使用静态库
先生成目标程序hello
gcc main.c libmyhello.a -o hello
运行 hello 程序
./hello
删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中
rm libmyhello.a
./hello
程序照常运行,静态库中的公用函数已经连接到目标文件中了
(5) 由.o 文件创建动态库文件
键入命令得到动态库文件 libmyhello.so
gcc -shared -fPIC -o libmyhello.so hello.o
直接使用该命令会出现错误,要删除原来的hello.o文件,使用gcc -fpic -c hello.c命令重新生成hello.o文件,再进行动态库文件的创建。
(6)在程序中使用动态库
输入命令生成目标文件
gcc -o hello main.c -L. -lmyhello
运行文件,出现错误
原来是找不到动态库文件 libmyhello.so。程序在运行时,会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目录/usr/lib 中,再尝试。
sudo mv libmyhello.so /usr/lib
(7)静态库和动态库同名时,gcc 命令会使用哪个库文件?
先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态
sudo rm -f hello hello.o