https://blog.csdn.net/mahoon411/article/details/113565482
库:可执行代码的二进制文件,里面有可以直接使用的函数,变量等;不能单独运行
- 因为 Linux 和 Win 的链接器、汇编器、编译器的不同,相同代码的库不同
Linux 中有两种:
- 静态库:在主程序链接库的时候,静态库被直接写入主程序,会极大增加主程序体积
- 动态库:在主程序链接库的阶段只是在主程序中加入库的标记,在主程序运行时,动态库会被加载到内存中供主程序调用,不会增大主程序体积
动态库
动态库文件在运行时候载入主程序,由动态库载入器 ld-linux.so 程序完成,先后搜索 ELF 文件的
DT_RPATH段→环境变量LD_LIBRARY_PATH→/etc/ld.so.cache文件列表→/lib/或/usr/lib目录
直到找到库文件,然后将其载入内存。
- Linux 上的可执行文件是 ELF(executable and linkable file) 格式
动态库名称:libxxx.so
动态库的使用和链接器的搜索路径有关,如果只是临时需要,可以添加 LD_LIBRARY_PATH 变量
如果是永久变量,可以添加到 .bashrc 文件
不推荐添加到 /lib 或 usr/lib 文件夹内,因为很可能覆盖原有的文件
https://blog.csdn.net/mahoon411/article/details/113565482
动态库加载失败:cannot open shared object file: No such file or directory
静态库
命名规则:libxxx.a
- 制作过程:
-
通过 gcc 编译器编译 .c 文件成 .o 文件
-
使用 ar(archive 等工具)将 .o 文件打包成 .a 文件
ar libxxx.a xxx.o xxx.o
-
报错 found _add in lib/libcalc.a(add.o), declaration possibly missing extern "C”(extern “C”)
如果是 .cpp 文件,和 .c 文件编译链接在一起,就会报错
这里的树形结构是
- app 是可执行文件
- main.cpp 主程序
按照步骤
- gcc -c add.c
- ar rcs libcalc.a add.o
- mv libcalc.a …/lib
- gcc -o app main.cpp -L lib -l calc -I(i大写) include
报错
- gcc 编译器报错
/usr/bin/ld: /tmp/cc3NjJG6.o: in function main':
main.cpp:(.text+0x54): undefined reference to
add(int, int)’
collect2: error: ld returned 1 exit status
- clang 编译器下报错 (就这么看,clang 编译器是更优秀的)
需要更改 head.h 为
#include "stdio.h"
extern "C"
{int add(int a, int b);
}
表明是 c 函数,要求编译器以 c 的标准编译 add()