c语言编译、静态库、动态库

参考文献1:https://blog.csdn.net/zyhse/article/details/105228959
参考文献2:https://blog.csdn.net/flyztek/article/details/73612469

一.将*.cpp编译成可执行文件

1.编写程序文件

vim hello.cpp

#include
 
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 
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 
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)

你可能感兴趣的:(c语言)