测试五-共享库

测试五-共享库

除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?
main.c如何使用mymath.so?

编译源代码为对象文件

将所有的源代码文件(.c或.cpp文件)编译成目标文件(.o文件)。使用-c选项来告诉GCC只编译不链接。

gcc -fPIC -c add.c
gcc -fPIC -c sub.c
gcc -fPIC -c mul.c
gcc -fPIC -c div.c

-fPIC选项告诉GCC生成位置无关代码(Position Independent Code),这对于创建共享库是必要的。

创建共享库

使用-shared选项来告诉GCC创建一个共享库。

gcc -shared -o mymath.so add.o sub.o mul.o div.o

mymath.so是创建的共享库的名称。

设置库版本(可选)

为共享库设置版本号,可以在库的名称后面添加版本信息,如mymath.so.1。还可以通过创建一个符号链接,以便用户可以通过库的简单名称(如mymath.so)来链接它。

ln -s mymath.so.1 mymath.so

安装共享库(可选)

共享库会被安装到系统的库目录中,如/usr/lib或/usr/local/lib。使用install命令来安装库及其头文件。

sudo install -D -m 755 mymath.so /usr/local/lib/mymath.so
sudo ln -s /usr/local/lib/mymath.so /usr/local/lib/mymath.so

使用动态库

库文件命名时,如果不以lib开头,则不需要-l 参数;以lib开头命名时,可以使用-l参数并省略lib和后缀
-L参数表示库文件位置(如果库文件不在标准库路径中)

gcc -g main.c -o main -L ./ mymath.so

生成动态库

静态库和动态库区别

静态库

在 Linux 中静态库以 lib 作为前缀、以 .a 作为后缀,形如 libxxx.a(其中的 xxx 是库的名字,自己指定即可)。静态库以之所以称之为「静态库」,是因为在链接阶段,会将汇编生成的目标文件 .o 与引用的库一起链接到可执行文件中,对应的链接方式称为静态链接。

动态库

在 Linux 中动态库以 lib 作为前缀、以 .so 作为后缀,形如 libxxx.so(其中的 xxx 是库的名字,自己指定即可)。相比于静态库,使用动态库的程序,在程序编译时并不会链接到目标代码中,而是在运行时才被载入。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该共享库的实例,避免了空间浪费问题。同时也解决了静态库对程序的更新的依赖,用户只需更新动态库即可。

断点调试

posted @ 2025-01-02 11:32  Arisf  阅读(2)  评论(0编辑  收藏  举报