gcc创建和使用动态库、静态库

标签: gcc 建和 动态库 | 发表时间:2015-04-26 01:49 | 作者:u011708919
出处:http://blog.csdn.net

本文以工程 libtest为例来说明用gcc创建和使用静态库、动态库的过程。 libtest工程目录结构如下:


libtest/include/hello.h文件内容:

#ifndef __HELLO_H__
#define __HELLO_H__
 
void sayHello(void);
 
#endif           


libtest/lib/hello.c文件内容:

#include "hello.h"
#include <stdio.h>
 
void sayHello(void)
{
     printf("Hello Geeks !\n");
}      


libtest/src/main.c文件内容:

#include "hello.h"
 
int main(void)
{
     sayHello();
 
     return 0;
}    

创建并使用静态库:

1,进入libtest/lib目录,执行命令:

 gcc -c -I../include hello.c
该命令将会在当前目录生成目标文件hello.o。

注意:参数-I是添加头文件搜索目录,这里因为hello.c中有#include "hello.h", hello.h在libtest/include目录中,这里需要指定该目录通知gcc,否则会出现错误提示“找不到头文件hello.h”。

2,在libtest/lib目录中执行命令:

 ar rc libhello.a hello.o
该命令将会在当前目录生成静态库文件libhello.a。

ar命令就是用来创建、修改库的,也可以从库中提出单个模块,参数r表示在库中插入或者替换模块,c表示创建一个库。

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即可。

4,运行main程序:

./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就没有错误了。



PS:

       环境变量LD_LIBRARY_PATH指示动态连接器可以装载动态库的路径,在链接动态库文件前设置该变量为库文件所在路径。注意:用export LD_LIBRARY_PATH=”…”方式只是临时生效的,如果要永久有效可以写入~/.bashrc文件中,跟修改PATH类似,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。当然如果有root权限的话,也可以修改/etc/ld.so.conf文件,将要添加的动态库搜索路径写入该文件中,然后调用/sbin/ldconfig来达到同样的目的。




作者:u011708919 发表于2015/4/25 17:49:31 原文链接
阅读:63 评论:0 查看评论

相关 [gcc 建和 动态库] 推荐:

gcc创建和使用动态库、静态库

- - CSDN博客综合推荐文章
本文以工程 libtest为例来说明用gcc创建和使用静态库、动态库的过程. libtest工程目录结构如下:. libtest/include/hello.h文件内容:. libtest/lib/hello.c文件内容:. libtest/src/main.c文件内容:. 1,进入libtest/lib目录,执行命令:.

GCC安装 配置

- - CSDN博客推荐文章
下载:  http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2. 浏览:  http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/. 查看Changes:  http://gcc.gnu.org/gcc-4.5/changes.htm.

GCC将用C++实现

- Chris - Solidot
Lwn.net报道,GCC(GNU Compiler Collection,GNU编译器套装)将从一个C语言实现变成C++语言实现. Mark Mitchell在官方邮件列表上宣布,GCC指导委员会和自由软件基金会(FSF)同意GCC本身的代码将使用C++语言编写. 此举是为了向用户提供一个更好的编译器,而不是因为C++代码库本身的原因.

GCC功能及使用

- - CSDN博客推荐文章
编译过程(从源代码到可执行文件). 预处理:gcc -Ehello.c -o hello.i //生成预处理后的源文件. 汇编:gcc -S hello.i //生成hello.s. 目标代码生成:gcc -c hello.s //生成hello.o. 连接:gcc hello.o -o hello //生成可以行文件hello.

RMS谈GCC、LLVM和Copyleft

- - Solidot
ESR(Eric S.Raymond)在GCC邮件列表上发贴预言,LLVM/Clang编译器将在3到5年内威胁到GCC的统治地位,认为GCC编译器的反插件政策正成为一大障碍. 虽然Clang尚未达到GCC的成熟度,但在某些方面它拥有比GCC更出色的特性,例如错误信息. ESR建议GCC应允许非自由的插件.

GCC、LLVM-GCC、DragonEgg和Clang编译性能对比

- allengaller - Solidot
Phoronix利用Phoronix Test Suite测试了GCC 4.2.1、4.3.0、4.4.0、4.5.0、GCC 4.6.0 2010-10-30开发预览版,以及LLVM-GCC 2.8、LLVM DragonEgg 2.8和Clang 2.8编译器的编译性能. 测试结果显示,与新贵LLVM-GCC和Clang相比,有二十多年历史的GCC编译器确实比较慢 虽然LLVM和Clang的新版本提供了完整的C++支持,并且能编译Linux kernel,但它们目前还达不到取代成熟GCC的程度,Clang或DragonEgg还无法完成某些常见任务的编译,性能也未能如意.

关于gcc、glibc和binutils模块之间的关系

- - 博客园_iTech's Blog
转自: http://www.mike.org.cn/articles/linux-about-gcc-glibc-and-binutils-the-relationship-between-modules/. 一、关于gcc、glibc和binutils模块之间的关系.   1、gcc(gnu collect compiler)是一组编译工具的总称.

如何利用GCC编译选项检测栈溢出

- - 极客范 - GeekFan.net
Stack smashing是堆栈缓冲区溢出(stack buffer overflow)的一个时髦称谓. 它表示利用代码中存在的缓冲区溢出bug而发起的攻击. 在早期,这完全是程序员的责任,他们要确保代码中不存在缓冲区溢出的问题. 但是随着时间推移,技术的不断发展,现在像gcc这样的编译器已经有编译选项用来确保缓冲区溢出问题不被攻击者利用来破坏系统或者程序.

linux下用gcc创建静态链接库和动态链接库

- - CSDN博客推荐文章
上一篇文章介绍了在windows下如何创建静态链接库和动态链接库( http://blog.csdn.net/love_cppandc/article/details/8502773),这一篇介绍一下在linux下如何创建静态链接库和动态链接库. 在linux下,静态库文件是.o结尾,动态库文件是.so结尾.

CentOS6.9完全离线升级安装gcc-5.4.0 - weixin_40420213的博客 - CSDN博客

- -
系统自带的gcc版本为4.4.7,升级至5.4.0版本,需要提前准备以下安装包:. gcc-5.4.0.tar.gz 安装包. gmp-4.3.2.tar.bz2 gcc依赖包. mpfr-2.4.2.tar.bz2 gcc依赖包. mpc-0.8.1.tar.gz gcc依赖包. 上面三个依赖包的版本依据,可以将gcc-5.4.0.tar.gz解压后在gcc-5.4.0/contrib/download_prerequisites文件中找到.