静态库 动态库创建和链接

news/2024/7/21 15:01:20 标签: gcc, library, path, 编译器, include, vim

================================================

 

静态链接库:

1、编译生成目标文件

gcc -c struct.c

2、创建静态

ar cqs libstruct.a struct.o (顺序不能乱)

3、链接静态链接库,生成可执行文件

gcc main.c -static -L. -ltest -o main

动态链接库:

1、编译成动态链接库

gcc struct.c -fPIC -shared -o libstruct.so

2、链接动态链接库,生成可执行文件

gcc main.c -L. -lstruct -o main

3、设置库文件的环境路径

1)bashrcprofile文件里用LD_LIBRARY_PATH定义,然后用source加载。

2)把库路径添加到ld.so.conf文件中,然后用ldconfig加载。

3)ldconfig /home/user/lib,仅能暂时性使用,若下次ldconfig时此目录下的动态链接库就不能被共享了。

gcc一些参数解析

-shared:指定生成动态链接库。

-static:指定生成静态链接库。

-fPIC:表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。

-L.:表示要连接的库在当前目录中。

-l:指定链接时需要的动态库编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。

-Wall:生成所有警告信息。

-ggdb:此选项将尽可能的生成gdb的可以使用的调试信息。

-g编译器在编译的时候产生调试信息。

-c:只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件)

-Wl,options:把参数(options)传递给链接器ld。如果options中间有逗号,就将options分成多个选项,然后传递给链接程序。

 

 

例子:

 

              生成一个myhello的静态库  ,在hellotest.c 中静态链接myhello 的库

步骤1

              vim hello.c

              #include<stdio.h>

              int hello()

              {

                     printf(“helloworld/n”);

}

步骤2

              编译生成目标文件 .o 文件

               gcc –c hello.c –o hello.o

步骤3

              创建静态库

              ar crs libmyhello.a hello.o

步骤4

              应用静态库:

              vim hellotest.c

              extern int hello(void);       //extern 相当于include” hello ”

              int main(void)

              {

                     hello();

}

步骤5

              使用静态链接库

              gcc –o hello hellotest.c –L. –lmyhello

              ./hello

显示:

              helloworld

 

函数库分为静态库和动态库两种。

  静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  程序1: hello.h

  #ifndef HELLO_H

  #define HELLO_H

  void hello(const char *name);

  #endif //HELLO_H

  程序2: hello.c

  #include <stdio.h>

  void hello(const char *name)

  {

  printf("Hello %s!/n", name);

  }

  程序3: main.c

  #include "hello.h"

  int main()

  {

  hello("everyone");

  return 0;

  }

  无论动态库还是静态库都需要用到.o文件来生成,先编译生成.o文件。

  # gcc -c hello.c

  1:创建静态库

  静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a

  # ar cr libmyhello.a hello.o

  使用静态库:只需要在你的源程序中加入包含你所需要使用到的函数的声明(即包含头文件),然后在gcc生成目标文件时候指明静态库就OK了(除非你包含的头文件在/usr/include,库文件在标准库/usr/lib,/lib下,否则你得显示指明他们的路径)

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  Hello everyone!

  删除静态库文件运行./hello,程序正常运行,说明静态库公用函数已经链接到目标文件。

  2: 利用.o文件创建动态库

  动态库文件扩展名为.so

  # gcc -shared -fPCI -o libmyhello.so hello.o

  动态库的使用与静态库使用方式一样

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

  哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。

  如何找到生成的动态库有3种方式:

  1)把库拷贝到/usr/lib/lib目录下。

  (2)LD_LIBRARY_PATH环境变量中加上库所在路径。

  例如动态库libhello.so/home/example/lib目录下:

  $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/example/lib

  (3) 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

  当静态库和动态库同名时, gcc命令将优先使用动态库。


http://www.niftyadmin.cn/n/1117362.html

相关文章

ef db first oracle,ASP.NET Core 开发-EF Core 1.0 Database First

来源&#xff1a;LineZero链接&#xff1a;http://www.cnblogs.com/linezero/p/EFCoreDBFirst.htmlASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库。Entity Framework Core 1.0 也已经发布了&#xff0c;可以适用于 .NET Cor…

让服务开机自动启动

在centos 6中 一般 chkconfig --add httpd chkconfig httpd on 在centos 7中 systemctl enable httpd 本文转自 神迹难觅 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/ji123/1953026&#xff0c;如需转载请自行联系原作者

Java 8 Stream介绍及使用2

(原)stream中另一些比较常用的方法. 1、 public static<T> Stream<T> generate(Supplier<T> s) 通过generate返回一个Stream对象&#xff0c;接收一个 Supplier函数 例如&#xff1a; Stream stream8 Stream.generate(UUID.randomUUID()::toString); 2、 O…

欧文6 oracle aqua 测评,欧文6实战测评!详细说说

昨天心水很久的欧文六到了紫罗兰配色鞋子给我感觉特别棒话不多说开始本人6投4突 打法类似保罗火箭雷霆时期的样子&#xff0c;喜欢变向中距离1.抓地 9分。我打的是室外的橡胶地(东莞汇一城洛克公园那种)没有滋滋声但是一点都不打滑 变向急停都没问题2.包裹9分。我平时nike都是4…

破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988)

破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988) 题意描述 你在输入文章的时候&#xff0c;键盘上的Home键和End键出了问题&#xff0c;会不定时的按下。你却不知道此问题&#xff0c;而是专心致志地打稿子&#xff0c;甚至显示器都没开。当你打开显示器之…

matlab fft2 用法,Matlab自己的fft2没有循环(Matlab own fft2 without loops)

Matlab自己的fft2没有循环(Matlab own fft2 without loops)我有个问题。我有一个任务是在Matlab中不使用for循环编写自己的fft2。 有一个计算此任务的公式&#xff1a;F(u&#xff0c;v) sum(0到M-1){sum(o到N-1){f(m&#xff0c;n)* e ^( - i * 2pi *(um / M vn / N)) }}用两…

Android中px dpi dip density densityDpi 的相关说明

①Px&#xff08;Pixel像素&#xff09;&#xff1a;不同设备显示效果相同。这里的“相同”是指像素数不会变&#xff0c;比如指定UI长度是100px&#xff0c;那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真&#xff0c;在大分辨率上…

TCP/IP网络编程函数解析

TCP/IP网络编程函数解析 转载&#xff1a;http://blog.csdn.net/sailor_8318/archive/2009/01/08/3736837.aspx socket&#xff08;建立一个socket通信&#xff09; 相关函数 accept&#xff0c;bind&#xff0c;connect&#xff0c;listen 表头文件 #include<sys/types.…