在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编译动态和静态链接库.pdf 学习资料 复习资料 教学资源
转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力
介绍gcc下常用的一些参数,包括预编译、编译、汇编和链接,以及优化和调试。静态链接与动态链接的内容。绝对原创!!
源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。
预处理 编译 汇编 链接 下面逐个使用 预编译:宏替换 ,文件引入 ,去除空行,注释,为编译做准备 预编译命令: gcc -E test.c -o test.i test.c中内容 #include int main(){ printf(“hello world!\n”); return 0; } -E...
第十章 使用自己的动态链接库 第十一章 在Dev-Cpp中创建自己的工程 第十二章 在Dev-Cpp中生成自己的包 第十三章 Dev-Cpp包制作补完篇 第十四章 wxWidget的下载与安装 第十五章 wxWidget的编译与用wxWidget编译程序 ...
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...
使用方法:包含编译器相关头文件、wx头文件、指定__WXMSW__、_UNICODE、NDEBUG(发行版专用)、WSUSINGDLL(动态库专用)这几个宏,指定-finput-chaaset=GBK(系统的编码),指定链接库,使用TDMGCC编译GBK(系统...
函数的编译:使用gcc –c add.c -fPIC只编译不链接函数.c文件,分别生成函数的目标文件(例如add.o、sub.o、mul.o和div.o)。 函数的归档入库:使用gcc -o libdynamic.so $(objects) -share将目标文件归档入库。 ...
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 多...
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 多...
SharedLibrary: 在 POSIX 系统上编译动态链接库,在 Windows 平台上编译 DLL。 这个简单的 SConstruct 的配置文件从一个侧面说明了使用 SCons 来建造程序是多么的简单。 在实际的项目开发中,程序的建造规则远比 ...
link=static 表示编译为静态库, runtime-link=static 则表示,应用程序最终会使用静态链接的 C 运行时。这个在 windows 平台是必须的要求。因为 VC 的 C 和 C 运行时打包起来非常麻烦。(mingw 的也一样)linux ...
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 多...
静态库比动态库快一点,但是,如果修改了静态库,则需要重新链接使用该库的整个项目代码库。 假设没有更改函数定义,则无需重新链接代码库即可更改动态库。 安装过程如下: 克隆此存储库并导航到它。 为静态或...
例如,用于Fedora: sudo dnf install gcc-c++静态版本为Linux发行版提供了libstdc ++和libgcc静态链接,这些发行版无法提供支持> = C11的库。使用在其基本用例中,仅需要提供Ryuto的输出目录和RNA-Seq使用的库类型...