`
lovnet
  • 浏览: 6708041 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

gcc 编译使用动态链接库和静态链接库

 
阅读更多
在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。
动态链接库的好处就是节省内存空间。
1、Linux下创建动态链接库
在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。

例如有文件:hello.c hello.h main.c

编译:gcchello.c-fPIC-olibhello.so
其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,
所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的.
将main.c与hello.so动态库l链接

gccmain.c-L.-lhello-omain

一、动态链接库

1.创建hello.so动态库

hello.h

hello.c


main.c




这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.

3.编译成够后执行./main,会提示:

In function `main':main.c:(.text+0x1d): undefined reference to `hello'collect2: ld returned 1 exit status

这是因为在链接hello动态库时,编译器没有找到。解决方法:

可以使用ldd来查看动态链接情况:

结果:
linux-gate.so.1 => (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目标程序没有链接动态库,则打印“not a dynamic executable”

这样,再次执行就成功输出:hello world

二、静态库

文件有:main.c、hello.c、hello.h
1.编译静态库hello.o:



2.把目标文档归档

程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。
3.链接静态库

这里的-static选项是告诉编译器,hello是静态库。
或者:这样就可以不用加-static

4.执行./main

输出:hello world

参考:http://blog.csdn.net/a600423444/article/details/7206015






  


  
分享到:
评论

相关推荐

    GCC 编译使用动态链接库和静态链接库的方法

    根据链接时期的不同,库又有静态库和动态库之分,有别于静态库,动态库的链接是在程序执行的时候被链接的

    GCC编译动态和静态链接库.pdf

    GCC编译动态和静态链接库.pdf 学习资料 复习资料 教学资源

    gcc编译动态和静态链接库

    转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。

    grpc-1.30.2 Linux 编译静动态库

    默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...

    动态和静态链接库

    gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力

    gcc常用参数(静动态链接 优化 调试)

    介绍gcc下常用的一些参数,包括预编译、编译、汇编和链接,以及优化和调试。静态链接与动态链接的内容。绝对原创!!

    静态库和动态库:.doc

    源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。

    动态库和静态库用法

    预处理 编译 汇编 链接 下面逐个使用 预编译:宏替换 ,文件引入 ,去除空行,注释,为编译做准备 预编译命令: gcc -E test.c -o test.i test.c中内容 #include int main(){ printf(“hello world!\n”); return 0; } -E...

    Dev-CppMingw32环境介绍(DOC)

    第十章 使用自己的动态链接库 第十一章 在Dev-Cpp中创建自己的工程 第十二章 在Dev-Cpp中生成自己的包 第十三章 Dev-Cpp包制作补完篇 第十四章 wxWidget的下载与安装 第十五章 wxWidget的编译与用wxWidget编译程序 ...

    Linux静态库与动态库实例详解

    1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include test.h int main(){ test(); return 0; } // test.h #include using namespace std; void test(); // test.c #include test.h void test...

    wxMSW-3.1.2_gcc510TDMGCC_x64_Dev

    使用方法:包含编译器相关头文件、wx头文件、指定__WXMSW__、_UNICODE、NDEBUG(发行版专用)、WSUSINGDLL(动态库专用)这几个宏,指定-finput-chaaset=GBK(系统的编码),指定链接库,使用TDMGCC编译GBK(系统...

    老生常谈C语言动态函数库的制作和使用(推荐)

    函数的编译:使用gcc –c add.c -fPIC只编译不链接函数.c文件,分别生成函数的目标文件(例如add.o、sub.o、mul.o和div.o)。 函数的归档入库:使用gcc -o libdynamic.so $(objects) -share将目标文件归档入库。 ...

    linux网络编程-宋敬彬-part2

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    linux网络编程-宋敬彬-part3

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    SCON工具源码

    SharedLibrary: 在 POSIX 系统上编译动态链接库,在 Windows 平台上编译 DLL。 这个简单的 SConstruct 的配置文件从一个侧面说明了使用 SCons 来建造程序是多么的简单。 在实际的项目开发中,程序的建造规则远比 ...

    Q群云秘书 avbot (聊天机器人).zip

    link=static 表示编译为静态库, runtime-link=static 则表示,应用程序最终会使用静态链接的 C 运行时。这个在 windows 平台是必须的要求。因为 VC 的 C 和 C 运行时打包起来非常麻烦。(mingw 的也一样)linux ...

    linux网络编程-宋敬彬-part1

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    容器:此库提供各种容器。 每个容器都有实用程序功能来操纵其保存的数据。 这是一种抽象,无需手动管理和重新分配内存

    静态库比动态库快一点,但是,如果修改了静态库,则需要重新链接使用该库的整个项目代码库。 假设没有更改函数定义,则无需重新链接代码库即可更改动态库。 安装过程如下: 克隆此存储库并导航到它。 为静态或...

    RYUTO:龙人

    例如,用于Fedora: sudo dnf install gcc-c++静态版本为Linux发行版提供了libstdc ++和libgcc静态链接,这些发行版无法提供支持> = C11的库。使用在其基本用例中,仅需要提供Ryuto的输出目录和RNA-Seq使用的库类型...

Global site tag (gtag.js) - Google Analytics