参考文献1:https://blog.csdn.net/zyhse/article/details/105228959
参考文献2:https://blog.csdn.net/flyztek/article/details/73612469
一.将*.cpp编译成可执行文件
1.编写程序文件
vim hello.cpp
#include<stdio.h>
int main(void){
printf("Hello World!\n");
return 0;
}
2.编译(-o 可以指定全路径)
执行的命令:gcc hello.cpp -o hello
(将hello编译到根目录下gcc hello.cpp -o /hello)
输入ls命令,能看到当前文件夹下多了一个文件:hello
3.执行
执行:./hello
可得输出hello World!
二.编译静态库(用来测试打包动态库)
1.编写原始静态库文件
vim first.cpp
#include <stdio.h>
void first()
{
printf("first is a static library!\n");
}
2.生成*.o目标文件(相当于java的class文件)
gcc -c first.cpp
得到first.o,由于是中间文件,所以无法执行
3.生成静态库(类似hfs引用kbase的静态库)
ar -cr libfirst.a first.o
将得到libfirst.a
三.调用静态库(相当于java调用工具类)
1.编写调用脚本
vim second.cpp
#include <stdio.h>
void first();
int main()
{
printf("this is a active library!\n");
first();
return 0;
}
2.编译second.cpp,静态链接libfirst.a:
gcc second.cpp libfirst.a -o second.out
3.运行程序
./second.out
结果
this is a active library!
first is a static library!
三.so共享库生成(相当于java调用工具类)
1.创建so
由.o文件创建动态库文件,动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其
文件扩展名为.so。
例如:我们将创建的动态库名为first,则动态库文件名就是libfirst.so。
生成so文件:
gcc -shared -fPIC -o libfirst.so first.o
2.调用so
编译second.cpp:
gcc -o second.out second.cpp -L. -lfirst
上面不带.out也可以
3.执行second.out
./second.out
./second_1.out: error while loading shared libraries: libfirst.so: cannot open shared object file: No such file or directory
我们发现报错了,原来是找不到动态库文件libhello.so,程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。
若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
方法一:
cp libfirst.so /usr/lib
在次执行 ./second.out
this is a active library!
first is a static library!
方法二:
在编译second.cpp 时就指定当前so的所在路径
gcc -o second.out second.cpp -L. -lfirst -Wl,-rpath=/root/c++/
多个rpath用分号[;]隔开
查看当前编译出的文件与哪些库有关联可以使用ldd命令查看
ldd second.out
linux-vdso.so.1 (0x00007ffeb6db8000)
libfirst.so => /root/c++/libfirst.so (0x00007f606b341000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f606b000000)
/lib64/ld-linux-x86-64.so.2 (0x00007f606b34d000)
四、库和库的依赖
1.编译second.cpp
gcc -c second.cpp
将得到second.o
2.打成so文件
gcc -shared -fPIC -o libsecond.so second.o -Wl,-rpath=/root/c++/ -L./ -lfirst
3.ldd 查看依赖项
ldd libsecond.so
linux-vdso.so.1 (0x00007ffd61736000)
libfirst.so => /root/c++/libfirst.so (0x00007f78ab7aa000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78ab400000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78ab7b6000)