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; }
生成 .o 文件
gcc -c hello.c
生成静态库文件
ar cr libmyhello.a hello.o gcc -o hello main.c -L. -lmyhello ./hello Hello everyone!
生成动态库
gcc -shared -fPIC -o libmyshare.so hello.c gcc -o hello main.c -L. -lmyhello ./hello 结果 ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory 用strace 运行hello能看到在指定目录下找不到文件,将libmyshare.so拷贝到/usr/lib64目录下 再运行./hello就正常了
一些相关的命令
名称 | 含义 |
ar | 创建静态库,插入删除列出和提取成员 |
ldd | 列出一个可执行文件在运行时所需要的共享库 |
gcc | 强大的编译工具 |
nm | 列出一个目标文件的符号表中定义的符号 |
size | 列出目标文件中section的名字和大小 |
objdump | 所有二进制工具之母 能够显示一个目标文件中所有的信息 最大的作用是反汇编.text 片段中的二进制指令 |
readelf | 显示一个目标文件的完整结构 包括ELF头中编码的所有信息,包含size和nm的功能 |
strace | 跟踪调试工具 |
strip | 删除多余的段 |
objcopy | 将一个目标文件中的内容拷贝到另一个中 |
参考