-fPIC
或
-fpic
选项编译源文件,生成目标文件。
gcc -fPIC -c source_file.c
-fPIC
生成的代码可以被加载到内存中的任何位置,而
-fpic
生成的代码在某些架构上可以更快地进行地址绑定,但可能不适用于所有平台。
gcc
的
-shared
选项来指定生成动态库。
gcc -shared -o liblibrary_name.so object_file1.o object_file2.o ...
这里 -shared
选项告诉编译器生成一个动态库。
gcc -shared -o liblibrary_name.so.1.0 object_file1.o object_file2.o ...
ln -s liblibrary_name.so.1.0 liblibrary_name.so.1
ln -s liblibrary_name.so.1 liblibrary_name.so
这里, liblibrary_name.so.1.0
是带有具体版本号的库文件,而liblibrary_name.so.1
和liblibrary_name.so
是符号链接,分别指向主版本和库的当前版本。
-L
选项指定动态库的路径,使用
-l
选项指定要链接的库。
gcc program.c -L/path/to/library -llibrary_name -o program
LD_LIBRARY_PATH
环境变量来指定库的搜索路径。
export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
或者,可以在系统级的库缓存中添加库的路径,使用 ldconfig
命令。
sudo ldconfig /path/to/library
运行程序 :现在可以运行编译好的程序,动态链接器会在程序启动时加载所需的动态库。
- 动态库在程序运行时被加载,因此可执行文件的大小比使用静态库时小。
- 动态库允许库的代码在内存中共享,这意味着所有使用同一动态库的程序都共享同一份代码,节省内存。
- 动态库的更新只需要替换库文件,不需要重新编译使用该库的程序。
- 动态库的使用增加了程序的依赖性,如果库文件被删除或移动,程序可能无法运行。
- 动态库的版本管理很重要,不兼容的库更新可能导致依赖它的程序崩溃。
一个简单的例子:
add.c
和
multiply.c
。
add.c
:
int add(int a, int b) {
return a + b;
}
multiply.c
:
int multiply(int a, int b) {
return a * b;
}
编译源文件为共享对象 : 使用 gcc
编译这些源文件,并使用-shared
选项生成共享对象(动态库)。
gcc -fPIC -shared -o libmath.so add.c multiply.c
这里, -fPIC
生成位置无关代码,-shared
指定生成动态库,libmath.so
是我们创建的动态库的名称。
mv libmath.so libmath.so.1
ln -s libmath.so.1 libmath.so
这里, libmath.so.1
是带有具体版本号的库文件,而libmath.so
是一个符号链接,指向当前版本。
main.c
使用
add
和
multiply
函数。
main.c
:
extern int add(int, int);
extern int multiply(int, int);
int main() {
int sum = add(3, 4);
int product = multiply(3, 4);
printf("Sum: %d\n", sum);
printf("Product: %d\n", product);
return 0;
}
main.c
时,我们需要指定动态库的路径和库名。但是,由于动态库在运行时才被加载,编译时只需要声明外部函数。
gcc main.c -o program -L. -lmath
-L.
指定了动态库的搜索路径(当前目录)。-lmath
指定了要链接的库,链接器会查找libmath.so
或libmath.so.1
。
设置运行时库路径:在运行程序之前,确保动态链接器能找到动态库。可以通过设置 LD_LIBRARY_PATH 环境变量来指定库的搜索路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
运行程序 : 编译完成后,你可以运行生成的程序。
https://mp.weixin..com/program
Sum: 7
Product: 12

想了解更多
赶紧扫码关注
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/13418.html