gcc创建和使用静态库、动态库
2015-11-16 09:37
295 查看
[转载自]http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html
libtest/include/hello.h
libtest/lib/hello.c
libtest/src/main.c
该命令生成目标文件hello.o,注意:参数-I添加头文件搜索目录,这里因为hello.c中有#include “hello.h”,hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则出现错误提示“找不到头文件hello.h”。
这一步将在libtest/lib目录中生成一个hello.o文件。
该命令将hello.o添加到静态库文件libhello.a,ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库,关于ar命令的详细使用规则可以参考文章http://blog.csdn.net/xuhongning/article/details/6365200。
这一步将在libtest/lib目录中生成一个libhello.a文件。
该命令将编译main.c并链接静态库文件libhello.a生成可执行文件main,注意:参数-L添加库文件搜索目录,因为libhello.a在libtest/lib目录中,这里需要指定该目录通知gcc,参数-l指定链接的库文件名称,名称不用写全名libhello.a,只用写hello即可。
这一步将在libtest/src目录中生成可执行文件main。
这一步将在当前目录生成动态库文件libhello.so,参数-fPIC -shared固定格式,不用纠结他们什么意思。
此时在当前目录中已经生成了可执行文件main,执行./main时却提示错误:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory
也就是找不到动态库文件libhello.so,在网上找了答案说如果遇到这样的问题需要设置环境变量LD_LIBRARY_PATH,如下:
然后再执行./main就没有错误了。
【补充】
环境变量LD_LIBRARY_PATH指示动态连接器可以装载动态库的路径,在链接动态库文件前设置该变量为库文件所在路径,注意:用export LD_LIBRARY_PATH=”…”方式只是临时生效的,如果要永久有效可以写入~/.bashrc文件中,跟修改PATH类似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。
当然如果有root权限的话,也可以修改/etc/ld.so.conf文件,将要添加的动态库搜索路径写入该文件中,然后调用/sbin/ldconfig来达到同样的目的。
gcc创建和使用静态库、动态库
下面以工程libtest为例说明gcc创建和使用静态库、动态库的过程,libtest目录结构和内容如图1所示,其中三个文件hello.h,hello.c和main.c的内容如下。libtest/include/hello.h
#ifdef _HELLO_H_ #define _HELLO_H_ void hello(); #endif
libtest/lib/hello.c
#include "hello.h" #include <stdio.h> void hello() { printf("hello world!\n"); }
libtest/src/main.c
#include "hello.h" int main() { hello(); }
静态库过程如下:
(1)进入libtest/lib目录,执行命令:
gcc -c -I../include hello.c
该命令生成目标文件hello.o,注意:参数-I添加头文件搜索目录,这里因为hello.c中有#include “hello.h”,hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则出现错误提示“找不到头文件hello.h”。
这一步将在libtest/lib目录中生成一个hello.o文件。
(2)在libtest/lib目录,执行命令:
ar rc libhello.a hello.o
该命令将hello.o添加到静态库文件libhello.a,ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库,关于ar命令的详细使用规则可以参考文章http://blog.csdn.net/xuhongning/article/details/6365200。
这一步将在libtest/lib目录中生成一个libhello.a文件。
(3)进入libtest/src目录,执行命令:
gcc main.c-I../include -L../lib -lhello -o main
该命令将编译main.c并链接静态库文件libhello.a生成可执行文件main,注意:参数-L添加库文件搜索目录,因为libhello.a在libtest/lib目录中,这里需要指定该目录通知gcc,参数-l指定链接的库文件名称,名称不用写全名libhello.a,只用写hello即可。
这一步将在libtest/src目录中生成可执行文件main。
动态库过程如下:
(1)进入libtest/lib目录,执行命令:
gcc hello.c-I../include -fPIC -shared -o libhello.so
这一步将在当前目录生成动态库文件libhello.so,参数-fPIC -shared固定格式,不用纠结他们什么意思。
(2)进入libtest/src目录,执行命令:
gcc main.c-I../include -L../lib -lhello -o main
此时在当前目录中已经生成了可执行文件main,执行./main时却提示错误:
./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory
也就是找不到动态库文件libhello.so,在网上找了答案说如果遇到这样的问题需要设置环境变量LD_LIBRARY_PATH,如下:
export LD_LIBRARY_PATH=”../lib” gcc main.c -I../include -L../lib -lhello -o main
然后再执行./main就没有错误了。
【补充】
环境变量LD_LIBRARY_PATH指示动态连接器可以装载动态库的路径,在链接动态库文件前设置该变量为库文件所在路径,注意:用export LD_LIBRARY_PATH=”…”方式只是临时生效的,如果要永久有效可以写入~/.bashrc文件中,跟修改PATH类似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。
当然如果有root权限的话,也可以修改/etc/ld.so.conf文件,将要添加的动态库搜索路径写入该文件中,然后调用/sbin/ldconfig来达到同样的目的。
相关文章推荐
- 在Windows平台下使用安装GCC(图)
- 链接库动态链接库详细介绍
- VC6.0如何创建以及调用动态链接库实例详解
- linux使用gcc编译c语言共享库步骤
- C/C++编译器GCC下的常用编译命令总结
- Lua5.1中加载dll动态链接库的方法
- GCC 编译使用动态链接库和静态链接库的方法
- GCC 编译c程序的方法及过程解析
- linux动态链接库使用方法分享
- 在Visual Studio中用C++语言创建DLL动态链接库图文教程
- Python调用C/C++动态链接库的方法详解
- Glusterfs的编译选项 #pragma GCC poison system popen
- 【笔记】CentOS上源码安装GCC 4.8.2
- 【笔记】CentOS
- RHEL 4.7 (64bit) 环境安装 GCC 4.6 测试记录 (更新至gcc-4.6.1)
- GCC 5 即将发布
- [转载]Visual Studio, GCC, Clang, Intel 对 C++11 特性的支持一览表
- C++爱好者博客
- Linux环境下编写C程序