GCC生成动态库

以下内容仅作为本人工作笔记

main.c

1 #include <stdio.h>
2 void hello(void);
3 int main(int argc, char ** argv) {
4         printf("This is main function!\n");
5         hello();
6         return 0;
7 }

hello.c

1 #include <stdio.h>
2 void hello() {
3         printf("This is hello function!\n");
4 }

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1:gcc -shared -fPIC -o libmyhello.so hello.c

把hello.c生成动态库。

-shared表示共享,用作动态库。

-fPIC position independent code表示位置无关代码,用于动态加载。

2:gcc -o myhello main.c -L. -lmyhello

-l‘xxxx‘ 表示提取libxxxx.so库文件。如实例则表示libmyhello.so。

-L‘path‘ 表示库文件的位置在path目录下。如实例则表示在当前目录 . 。

3:sudo cp libmyhello.so /usr/lib/

把动态库复制到linux默认库文件/usr/lib/下。

若想在任意库目录下生产可执行文件,去掉步骤2,用gcc -o myhello main.c ./libmyhello.so取代即可。

每次运行myhello 需要保证"./libmyhello.so"的存在,不推荐使用。

4:./myhello 提示:

This is main function!
This is hello function!

表示运行成功!

时间: 2024-11-14 12:27:45

GCC生成动态库的相关文章

gcc编译工具生成动态库和静态库之一----介绍

 1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有别于静态库,动态库的链接是在程序执行的时候被链接的.所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用.(TODO:链接动态库时链接阶段到底做了什么) 2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已.因为静态库被链接后

Linux生成动态库系统

Linux生成动态库系统 一个.说明 Linux下动态库文件的扩展名为 ".so"(Shared Object). 依照约定,全部动态库文件名称的形式是libname.so(可能在名字中增加版本). 这样.线程函数库被称作libthread.so. 静态库的文件名称形式是libname.a.共享archive的文件名称形式是libname.sa.共享archive仅仅是一种过渡形式,帮助人们从静态库转变到动态库. 小编综合自己学习体会以及网络上较好的内容.以简单的样例介绍动态库文件的生

Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [[email protected] tcpmsg]# gcc -o hello main.c -lmyhello /usr/bin/ld: cannot find -lmyhello collect2: error: ld returned 1 exit status 1 gcc链接动态库时的搜索路径 自以为在当前工程中设置好了环境变量 LD_LI

linux 生成动态库时提示relocation R_X86_64_32 against `.rodata&#39; can not be used when making a shared object;

linux生成动态库时遇到了relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC错误. 由于我的系统是AMD64位的,所以需要在编译的时候添加 -fPIC选项 解决方法: 例如: g++ -c -fPIC head.cpp    生成head.o g++ -fpic -shared -o libfun.so head.o linux 生成

cmake同时生成动态库与静态库的方法

我的目录结构 [[email protected] createLibrary]$ tree . ├── bin ├── build ├── CMakeLists.txt ├── include │   └── person.h ├── lib └── src ├── CMakeLists.txt ├── main │   ├── CMakeLists.txt │   └── main.cpp └── person ├── CMakeLists.txt └── person.cpp 7 dire

交叉编译sqlite3,生成动态库

1.下载源码,解压缩sqlite-autoconf-3300100.tar.gz 2.进入解压目录,执行: #:./configure --host=arm CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ --prefix=/usr 其中--host=要运行程序的主机 CC/CXX为用到的交叉编译工具链 --prefix=安装目录 3.make 将在当前文件目录下,自动生成可执行文件sqlite3及静态库文件sqlite3.a文件: 4.su

Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

环境:Ubuntu-13.10  32位(虚拟机).gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件: include文件夹用于存放头文件:bin文件夹用于存放生成的动态库.so文件:lib文件夹用于存放生成的静态库.a文件:project_makefile文件夹存放此工程的makefile文件:test文件夹存放用来测试静态库和动态库的源文件:另外在test_makefile_gcc文件夹下还包

关于linux下GCC生成共享库(动态链接库)的探究

下面列出了我在对共享库(动态链接库)编写以及使用时遇到的几个简单问题进行探究和解答: 参考文档:http://www.cnblogs.com/likwo/archive/2012/05/09/2492225.html 1.静态库.动态链接库.共享库有什么区别? 静态库(windows下为.lib,linux下为.a)是在程序编写前就编译到目标程序中了,而动态链接库(windows下为.dll)可以在程序执行的任何时候被动态加载.共享库(linux下为.so)是在程序启动的时候加载到程序中. 1)

Linux高级编程--02.gcc和动态库

在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio.h> void main(void) { printf("hello world!\r\n"); } 可以通过如下指令来编译出一个可执行文件: gcc hello.c 执行完该命令后,就会得到一个a.out的可执行文件. 编译的过程 前面的例子只是简单的介绍了一下gcc的使用方法,