参考文献1:https://blog.csdn.net/zyhse/article/details/105228959
参考文献2:https://blog.csdn.net/flyztek/article/details/73612469
vim hello.cpp
#include
int main(void){
printf("Hello World!\n");
return 0;
}
执行的命令:gcc hello.cpp -o hello
(将hello编译到根目录下gcc hello.cpp -o /hello)
输入ls命令,能看到当前文件夹下多了一个文件:hello
3.执行
执行:./hello
可得输出hello World!
vim first.cpp
#include
void first()
{
printf("first is a static library!\n");
}
gcc -c first.cpp
得到first.o,由于是中间文件,所以无法执行
ar -cr libfirst.a first.o
将得到libfirst.a
vim second.cpp
#include
void first();
int main()
{
printf("this is a active library!\n");
first();
return 0;
}
gcc second.cpp libfirst.a -o second.out
./second.out
结果
this is a active library!
first is a static library!
由.o文件创建动态库文件,动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其
文件扩展名为.so。
例如:我们将创建的动态库名为first,则动态库文件名就是libfirst.so。
生成so文件:
gcc -shared -fPIC -o libfirst.so first.o
编译second.cpp:
gcc -o second.out second.cpp -L. -lfirst
上面不带.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)
gcc -c second.cpp
将得到second.o
gcc -shared -fPIC -o libsecond.so second.o -Wl,-rpath=/root/c++/ -L./ -lfirst
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)