`
daly1987
  • 浏览: 7648 次
文章分类
社区版块
存档分类
最新评论

GCC静态链接和动态链接

 
阅读更多
写在前面:最近因为需要在不同版本的linux上运行编译后的文件,经常会遇到找不到需要的链接库文件的问题,后来突然想起了静态编译这一说。

1:建静态库

/*  hellos.h  */

#ifndef _HELLO_S_H

#define _HELLO_S_H

void printS(char* str);

#endif

/*  hellos.c  */

#include "hellos.h"

void printS(char* str)

{

    printf("print in static way: %s", str);

}

输入命令:

gcc -c -o hellos.o hellos.c

ar cqs libhellos.a hellos.o      //ar是生成库的命令,cqs是参数, libhellos.a是生成的静态链接库须以lib开头,hellos是库名,a表示是静态链接库,hellos.o是刚才生成目标文件。于是得到了libhellos.a这么一个静态链接库



2:主程序

/*  main.c  */

#include <stdio.h>

#include "hellos.h"



main()

{

    char* text = "Hello World!\n";

    printS(text);

}



编译链接:

gcc -o hello main.c -static -L. –lhellos

下面是关于上面命令的解释:

库依赖

使用-I参数可以向gcc的头文件搜索路径中添加新目录。

gcc hello.c -I /home/wuzhiguo/include -o hello

使用-L参数可以向gcc的库文件搜索路径中添加新目录。

gcc hello.c -L /home/wuzhiguo/lib -l mylib -o hello

-l mylib 是指示gcc去链接库文件libmylib.so。Linux下的库文件有一个约定,全部以lib开头,因此可以省去lib。

动态库:.so结尾,在运行时加载。

静态库:.a结尾,在编译时加载。

默认gcc优先加载动态库,可以在通过-static选项强制使用静态链接库。

gcc hello.c -L /home/wuzhiguo/lib -static -l mylib -o hello

       所以-L后面的点为当前目录,-l后面是要静态连接的库(libhellos.a)



然后运行hello可以看到输出

print in static way: Hello World!

删除libhellos.a和hellos.*后, 程序仍然正常运行。



下面再来看动态链接

3:建动态库

/*  hellod.h  */

#ifndef _HELLO_D_H

#define _HELLO_D_H

void printD(char* str);

#endif

/*  hellod.c  */

#include "hellod.h"

void printD(char* str)

{

    printf("print in dynamic way: %s", str);

}

输入命令:

gcc -shared -o libhellod.so hellod.c

于是得到了libhellod.so这么一个动态链接库,然后复制到/lib目录中,否则运行的时候找不到库文件。



4:主程序

/*  main.c  */

#include <stdio.h>

#include "hellod.h"

main()

{

    char* text = "Hello World!\n";

    printD(text);

}



编译链接:

gcc -o hello main.c -L. -lhellod

然后运行hello可以看到输出

print in dynamic way: Hello World!

如果这时候删除刚刚生成的libhellod.so,再运行则会报告一个找不到libhellod.so的错误,程序无法正常运行。

gcc -g -lstdc++ -g -WI,-Bdynamic -L. -lmy  -WI,-Bstatic -L. -lmy -o test.exe main.cc
分享到:
评论

相关推荐

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

    GCC 编译动态和静态链接库 GCC 编译动态和静态链接库是 Linux 应用开发中的一个重要组件,对于嵌入式 Linux 应用开发来说尤为重要。本文将详细介绍如何在 Linux 中创建静态库和动态库,以及使用它们。 静态库 ...

    gcc静态库与动态库生成

    ### gcc静态库与动态库生成 在嵌入式开发领域,了解如何使用gcc工具链来构建和管理静态库(`.a`文件)与动态库(`.so`文件)是非常重要的。本文将详细介绍如何通过gcc创建这两种类型的库,并讨论它们各自的用途、优...

    GCC_生成静态库和动态库.pdf

    这种特性使得静态链接的程序在不同的环境中具有更好的可移植性和独立性。 **动态库**则不同,它不会在编译阶段被嵌入到可执行文件中,而是在程序运行时根据需要动态加载。这不仅节省了磁盘空间,减少了程序的启动...

    linux下用gcc生成静态库和动态库.doc

    在Linux环境下,使用GCC(GNU Compiler Collection)生成静态库和动态库是开发过程中的常见操作。静态库和动态库在程序构建和运行时各有特点,理解它们的工作原理和创建方法对于软件开发至关重要。 首先,静态库在...

    Linux下Gcc生成和使用静态库和动态库详解

    ### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...

    静态链接库与动态链接库的区别

    在软件开发过程中,经常需要使用到库文件,这些库文件可以分为两大类:静态链接库(Static Library)和动态链接库(Dynamic Library)。这两种库的主要功能都是为了重用代码,减少代码重复编写的工作量,提高软件的...

    用gcc生成静态库和动态库.pdf

    3. 与静态库相似,可以先将main.c编译成对象文件main.o,然后使用gcc命令链接对象文件和动态库文件,生成可执行文件。 总结来说,无论是生成静态库还是动态库,gcc都提供了一套完整的工具链来实现这一过程。理解这...

    Linux下动态和静态链接库的使用

    在Linux系统中,链接库是实现程序功能复用的关键组件,分为静态链接库和动态链接库两种类型。本文主要探讨这两种库的创建、使用及其特点。 1. 静态函数库 静态库通常以`.a`为后缀,如`libxxx.a`。在编译过程中,...

    Linux C静态链接库与动态链接库编程简单介绍

    在Linux系统中,C语言的库分为静态链接库和动态链接库两种类型,它们都是为了实现代码重用和模块化设计的重要工具。本篇文章将深入浅出地介绍这两种链接库的原理、创建方法以及如何在程序中使用。 一、静态链接库 ...

    linux下如何生成使用静态和动态链接库

    链接库可以分为静态链接库和动态链接库两种,下面将详细介绍如何生成和使用这两种链接库。 一、静态链接库 静态链接库是指在编译时将库文件与目标文件链接在一起生成一个可执行文件的库。在 Linux 中,可以使用 ar...

    linux gcc生成动态库和静态库

    #### 二、用GCC生成静态和动态链接库的示例 为了更好地理解如何创建静态库和动态库,我们可以以一个简单的例子进行说明。假设我们有一个简单的头文件`hello.h`和实现文件`hello.c`,我们将基于这两个文件来创建静态...

    Linux下使用动态链接库和静态链接库的项目建立及单步调试

    这里使用预处理器指令`#ifdef SHARED`来区分动态和静态链接库中的函数定义方式。在动态链接库中,函数名被声明为函数指针类型,而在静态链接库中,则直接声明为函数。 ##### 1.2 编写 `getdate.c` `getdate.c`文件...

    使用gcc建立并调用静态库与动态库

    ### 使用GCC建立并调用静态库与动态库 在软件开发过程中,经常需要将一些功能模块封装成库供多个程序共享...通过以上步骤,我们可以使用GCC成功地创建并调用了静态库和动态库,这对于软件开发来说是非常有用的技能。

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

    ### gcc常用参数详解 ...通过以上对GCC参数的详细介绍,我们可以更好地理解如何使用GCC来进行高效的编译和链接工作。无论是对于初学者还是高级用户来说,掌握这些参数都能极大地提高开发效率和代码质量。

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

    根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态...

    Linux静态动态链接库的创建和使用

    链接库分为静态链接库和动态链接库两种类型。本文将详细介绍如何在Linux下创建和使用这两种类型的链接库。 #### 静态链接库 静态链接库是在编译时被链接到可执行文件中的库。一旦链接完成,库的内容就成为最终可...

Global site tag (gtag.js) - Google Analytics