Linux下编写简单的动态链接库
2011-11-03 02:16
344 查看
作者:Let it Be 来源:博客园 发布时间:2011-10-24 10:57 阅读:5 次 原文链接 [收藏]
(1)Linux下编写动态链接库。通常静态链接库是编译的时候和源文件一起编译生成可执行文件的。动态链接库则不是,它是一个已经编译好的文件(静态则不是),只有当程序运行的时候(但是编译的时候要将动态链接库的信息加载进来),它才去找动态链接库拿它想用的一些函数。而且动态链接库可以提高通用性,编写一个动态链接库可以让很多人一起用。有点类似类?
test_so.h
test_a.c
test_b.c
test_c.c
然后将这些文件编译为动态链接库gcc test_a.c test_b.c test_c.c --shared -fPIC -o libtest.so,则生成libtest.so文件(它已经编译好了),和普通可执行程序不同,它并没有main()。
在看如何调用它
编写test.c
gcc test.c -L . -ltest -o test ((-L .)表示动态链接库在本目录, (-ltest)表示动态链接库的名字为lib(test).so)。
然后通过ldd ./test查看有哪些动态链接库和可执行程序有关联。
结果发现libtest.so没有关联。
运行./test出现:
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
也就是说找不到这个动态链接库,但是我们已经在编译test.c的时候加入路径了?
这时候修改LD_LIBRARY_PATH变量
或者/etc/ld.so.conf添加动态链接库的路径。
view source
print?
(1)Linux下编写动态链接库。通常静态链接库是编译的时候和源文件一起编译生成可执行文件的。动态链接库则不是,它是一个已经编译好的文件(静态则不是),只有当程序运行的时候(但是编译的时候要将动态链接库的信息加载进来),它才去找动态链接库拿它想用的一些函数。而且动态链接库可以提高通用性,编写一个动态链接库可以让很多人一起用。有点类似类?
test_so.h
01 | #ifndef _TEST_SO_H |
02 | #define _TEST_SO_H |
03 |
04 | #include <stdio.h> |
05 | #include <stdlib.h> |
06 |
07 | void test_a(); |
08 | void test_b(); |
09 | void test_c(); |
10 |
11 | #endif |
1 | #include "test_so.h" |
2 |
3 | void test_a() |
4 | { |
5 | printf ( "this is test_a()\n" ); |
6 | } |
1 | <span style= "font-size: 13px;" >#include "test_so.h" </span> |
1 | <span style= "font-size: 13px;" > void test_b() |
2 | { |
3 | printf ( "this is test_b()\n" ); |
4 | }</span> |
1 | #include "test_so.h" |
2 | void test_c() |
3 | { |
4 | printf ( "this is test_c()\n" ); |
5 | } |
然后将这些文件编译为动态链接库gcc test_a.c test_b.c test_c.c --shared -fPIC -o libtest.so,则生成libtest.so文件(它已经编译好了),和普通可执行程序不同,它并没有main()。
在看如何调用它
编写test.c
1 | #include "test_so.h" |
2 |
3 | int main( void ) |
4 | { |
5 | test_a(); |
6 | test_b(); |
7 | test_c(); |
8 | return 0; |
9 | } |
然后通过ldd ./test查看有哪些动态链接库和可执行程序有关联。
结果发现libtest.so没有关联。
运行./test出现:
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
也就是说找不到这个动态链接库,但是我们已经在编译test.c的时候加入路径了?
这时候修改LD_LIBRARY_PATH变量
1 | #vim ~/.bashrc |
2 | 添加: |
3 | LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/xxx/Test |
4 | export LD_LIBRARY_PATH |
5 | 退出以后 |
6 | #source ~/.bashrc |
view source
print?
1 | #vim /etc/ld.so.conf |
2 | 添加一行:/home/xxx/Test |
3 | 然后刷新一把 |
4 | #/sbin/ldconfig -v |
5 | 再编译执行成功。 |
相关文章推荐
- Linux下编写简单的动态链接库
- 简单Demo:动态调用自己编写的动态链接库
- linux下编写动态链接库文件
- linux下动态链接问题(.so文件的编写与调用)
- linux下编写动态链接库文件
- 眼过千遍不如手过一遍——简单动态链接库的编写
- linux 静态动态链接库的编写和使用
- [LinuxC]加载动态链接库so程序简单实例
- (补充)linux下编写动态链接库步骤与知识点详解
- 简单 Demo:C++编写、调用动态链接库
- 眼过千遍不如手过一遍——简单动态链接库的编写
- linux简单实现静态链接和动态链接
- linux下动态链接问题(so文件的编写与调用)
- 在linux下编写动态链接库
- linux下Makefile中包含有shared library动态链接库文件时候的简单例子
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 使用c++开发excel插件 (3.4、编写一个简单的动态链接库)
- Linux制作动态链接库
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
- Linux C/C++ 多目标文件的链接及其Makefile编写($<与$^)