首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux基础——gcc编译、静态与动态(共享

优点: 寻址方便,速度快 在链接时被打包到可执行文件中,直接发布可执行程序即可以使用 缺点: 静态的代码被加载到可执行程序中,因此体积过大 如果静态的函数发生改变,必须重新编译可执行程序 3、静态的制作与使用.../include 第二步:创建静态 ar rcs libMyTest.a *.o 将所有.o文件打包为静态,r将文件插入静态中,c创建静态,不管是否存在,s写入一个目标文件索引到中.../lib 将静态文件放置lib文件夹下 nm libMyTest.a 查看中包含的函数等信息 第三步:使用静态 第一种方法: gcc + 源文件 +...-L 静态路径 + -l静态名 + -I头文件目录 + -o 可执行文件名 gcc main.c -L lib -l MyTest -I include -o app ..../app (执行失败,找不到链接,没有给动态链接器(ld-linux.so.2)指定好动态 libmytest.so 的路径) 第二种方法: gcc + 源文件 + -I头文件 + libxxx.so

7.9K40
您找到你想要的搜索结果了吗?
是的
没有找到

Linux gcc编译生成静态和共享动态的过程

这篇文章主要通过实例演示在Linux下如何使用gcc分别编译生成静态和动态文件以及其它程序如何使用这个生成的静态和动态。...-lmyhello 注意:如果出现下面这个错误,那么是由于程序链接需要静态,系统没有安装静态导致报错: [root@typecodes howto_gen_static_lib]# gcc -o hello...软连接,最后创建link name软链接 ##### 生成hello.o目标文件 [root@typecodes ~]# gcc -c -fPIC hello.c ##### 生成共享:对应real...-64.so.2 (0x00007f641cf53000) 3.1小节中的方法需要root用户权限,对于非root用户有方法二来解决:如前文《Linux gcc链接动态出错:LIBRARY_PATH...Linux系统动态搜索目录下。

47021

Linux从入门到入土③(GCC静态与动态链接、Git、Make、Makefile)

/test //执行可执行程序静态与动态链接不管是 Linux 还是 Windows 中的文件其本质和工作模式都是相同的,只不过在不同的平台上对应的文件格式和文件后缀不同。...系统提供的的路径/usr/lib/usr/lib64Linux⽂件名的组成:前缀(lib)+名+后缀(.a静态;.so动态)libmm.a:名为mm的静态;libnn.so:名为nn的动态...静态与动态的区别静态的代码在编译时就拷⻉到应⽤程序中,因此当有多个程序同时引⽤⼀个静态库函数时,内存中将会调⽤函数的多个副本。由于是完全拷⻉,因此⼀旦连接成功,静态就不再需要了,代码体积⼤。...动态是有执行权限的,而静态是没有执行权限的静态的制作与使用在 Windows 中静态一般以 lib 作为前缀,以 lib 作为后缀,中间是的名字需要自己指定,即: libxxx.lib在 Linux...动态链接器动态链接器是一个独立于应用程序的进程,属于操作系统,当用户的程序需要加载动态的时候动态连接器就开始工作了,很显然动态连接器根本就不知道用户通过 gcc 编译程序的时候通过参数 -L 指定的路径

1.5K10

Linux】动静态

@TOC 动静态 1....设计 分为 静态(.a)和动态(.so) 的命名 以c++的为例 输入 ls /lib64/libstdc++* 以lib开头要去除 的真实名字为 stdc++ ---- 一般云服务器...,默认只会存在动态,不需要动态静态需要单独安装 myadd.h 实现一个加法的声明 #pragma once int myadd(int d1,int d2); ---- myadd.c...- o myetst main.c 指令 会报错 有后,将引入项目,必须让编译器找到头文件和文件 因为引入的 属于第三方gcc并不能理解用的那个,要让编译器认识这个 ---- 加入...+标准的,所以被认为是第三方 ---- 告诉它需要链接mymath,就可以正常运行了,而不需要告诉头文件 将下载下来的和头文件,拷贝到系统默认路径下,这个行为就叫做在Linux下安装 对于任何软件而言

2.4K30

Linux】动静态

hello,大家好,今天我们继续学习Linux中的动静态,我们将从不同的角度来学习如何使用,并如何制作一个可供他人使用的动静态文件,并试着探究一下动态加载问题。那我们就开始学习吧!!...那么,Linux下的在什么位置呢? 如上便是我们使用所要吧包含的所有的头文件。 接下来,我们回答几个问题: 问:1....4、链接:连接目标代码,生成可执行程序。在链接之前,各个头文件都是独立进行编译的。各个头文件编译的过程互不干扰。 三.实现动静态 静态(.a):程序在编译链接的时候把的代码链接到可执行文件中。...首先:我们形成2个共识 我们知道gcc默认使用动态链接(建议选项),当动态静态同时存在时,gcc首选的是动态链接。...一般来说可执行程序在生成时,会对多个进行链接,我们可以使用ldd命令查看我们的程序链接了那些,可执行程序在连接时也可以选择部分采用动态部分采用静态

7310

Linux静态和动态

静态 一、静态 1. 静态概念 静态(.a):程序在编译链接的时候把的代码链接到可执行文件中。程序运行的时候将不再需要静态。 2....$^ %.o:%.c gcc -c $< .PHONY:clean clean: rm -f *.o *.a 如上图,首先我们为该静态的名字设置一个变量...gcc 默认是动态链接的,但个别,如果我们只提供 .a,gcc 也会局部性的把我们指定的 .a 进行静态链接,其它正常动态链接,如果加上 -static 选项,gcc 就只能链接 .a。...另外,如果别人给我们的中既包含动态也包含静态,即同一个中提供动静态两种gcc 默认使用动态!...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的以及地址,符号表就是动态链接这些动态的。

36110

Linux静态和动态

Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态静态 具体的动态静态的相关内容点击跳转 Linux一般分为动态静态静态(.a):文件以.a为后缀,程序在编译链接的时候把的代码链接到可执行文件中。...链接的本质:无非就是我们调用库函数的时候和标准是如何关联的问题 的名称:去掉前缀lib去掉后缀.so/.a剩下的就是名称,比如libc.so就是C gcc 在编译时默认使用动态链接,而生成静态链接...---- 四、制作动态 首先我们需要把文件全部编译成.o文件,这里与静态不同,需要带上选项 -fPIC,形成与位置无关码: gcc -c -fPIC my_add.c 什么是与位置的无关码的目标二进制文件...: 静态采用的是绝对编址 动态采用的是相对编址,动态中的指定函数的地址通过相对编址(中的偏移地址+段起始地址): 动态打包:-shared gcc -shared -o libmymath.so

26330

Linux】从零开始认识动静态 - 静态

直白一点来讲,假如你想玩游戏,静态就是买一台电脑放在宿舍,动态就是去网吧与其他人共享。 Linux系统下基本都是使用动态: 接下来我们来详细说说静态和动态。...来看一下具体命令: 生成静态[root@localhost linux]# ar -rc libmymath.a add.o sub.o ar是gnu归档工具,rc表示(replace and create...) 查看静态中的目录列表[root@localhost linux]# ar -tv libmymath.a rw-r–r-- 0/0 1240 Sep 15 16:53 2017 add.o rw-r–r...所以我们来认识一个新命令:gcc 文件名 -l名称 需要注意的是的名称,我们创建的是libmyc.a,那么这里写入的名称应该是myc ,要去掉lib .a 这样就可以了!...验证一下: 我们在回忆一下,我们之前学习gcc的时候说过: -static 此选项对生成的文件采用静态链接 shared 此选项将尽量使用动态,所以生成文件比较小,但是需要系统由动态 我们在这里并没有指明

11810

linux 动态 静态_静态库里面包含动态

动态静态 文件系统补完 文件的三个时间acm 动态静态 动态链接与静态链接 静态与动态静态的对比 生成静态 打包静态 使用静态 生成动态 打包动态 使用动态 文件系统补完...打包静态 由于生成静态需要先生成目标文件(.o)再进行打包,故先编写相应的源文件再将其编译成目标文件: [lyl@VM-4-3-centos 2022-3-14]$ gcc -c add.c -o...其实gcc编译时去链接和头文件是去默认路径以及当前路径寻找,而我们将静态打包到lib目录下,gcc编译时就找不到我们的了,所以我们需要加一些选项来告知gcc去寻找指定路径的及头文件。...gcc寻找的默认路径: /usr/include 因此,正确链接的指令为: gcc -o main main.c -I ./lib -L ....这里由于在依赖关系中已经点明了要生成的目标文件,故不带上$@也可以 打包动态不需要像静态一样使用ar指令,直接用gcc即可,但是需要带上-shared选项表示生成共享格式,这也体现了动态代码映射在共享区的特点

7.4K20

Linux共享静态、动态详解

1、静态函数,是在程序执行前就加入到目标程序中去了 ; 2、动态函数同共享函数是一个东西(在linux上叫共享对象, 文件后缀是.so ,windows上叫动态加载函数, 文件后缀是.dll)...静态函数 静态函数实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数文件。Ar是archiver的缩写。...静态函数对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数文件。...在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数,你可以使用它了。...你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用gcc来编译产生可执行代码的话,你可以用“-l”参数来指定这个库函数。你也可以用ld来做,使用它的“-l”和“-L”参数选项。

8.8K10

linux动态静态的使用_静态的使用

认识动静态Linux下创建文件编写以下代码,并生成可执行程序。...在Linux下,我们可以通过ldd 文件名来查看一个可执行程序所依赖的文件。...此时我们可以看到,libc-2.17.so实际上就是一个共享的目标文件,准确来说,这还是一个动态。 在Linux当中,以.so为后缀的是动态,以.a为后缀的是静态。...因为我们使用gcc编译的是C语言,而gcc就是用来编译C程序的,所以gcc编译的时候默认就找的是C,但此时我们要链接的是哪一个编译器是不知道的,因此我们还是需要使用-l选项,指明需要链接文件路径下的哪一个...第二步:使用-shared选项将所有目标文件打包为动态 与生成静态不同的是,生成动态时我们不必使用ar命令,我们只需使用gcc的-shared选项即可。

4.7K20

Linux静态与动态加载

Linux当中,以.so为后缀的是动态,以.a为后缀的是静态。 在Windows当中,以.dll为后缀的是动态,以.lib为后缀的是静态。 认识了动态,那静态,又是什么呢?...,我们编写main函数来使用Add和Sub函数: 这里我们不能直接用gcc像以前一样编译main.c,因为现在gcc编译器默认只认系统提供的,而我们需要链接的是第三方,这里我们链接第三方有这几种方法如下...注意上面我打包了两个,虽然看后缀一个静态,一个动态,但是其实上述的都是静态linux不是单单通过后缀来判断一个的类型,下面就来看看如何真正打包一个动态吧。...打包:使用-shared选项将所有目标文件打包为动态 与生成静态不同的是,生成动态时我们不必使用ar命令,我们只需使用gcc的-shared选项即可。...gcc -shared -o libmyc.so test2.o test3.o  像之前一样将头文件和动态组合进一个文件夹: 该动态和刚才的静态使用方法一样: gcc main.c -o a.out

13410

Linux】动静态以及动静态链接

我们可以通过ldd 可执行程序 命令,来查看该程序所用到的的具体信息 也就是说:系统把这些函数实现都被做到名为 libc.so.6 的文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径...动静态与动静态链接 在Linux下共分为两种,一种是动态,另一种为静态。其实我们可以通过后缀就可以区分该是否为动态。...静态静态链接 感性理解 感性理解就是将网吧里我们最喜欢的那台电脑给买回来,放在宿舍里供自己玩耍。...理性理解 静态专门让编译器对用户的程序进行静态链接,在链接时,将静态中所需要的完整代码给拷贝到自己的可执行程序内部中。...就好比将网吧里想要的那台电脑给买回宿舍,会很大的占用我们的私人空间(Linux中默认的方式为动态链接,当然我们可以用gcc/g++编译时使用-static的命令,来实现以静态链接的方式运行。)

4.8K50

Linux之动态静态

前言 一、动态静态概念 在之前的文章中,介绍过动静态的概念,因此这次我们只是简单回顾一下。 Linux中的分为动态静态。...的名称:去掉前缀lib和后缀'.a/.so'剩下的就是名称,例如:libc.so就是Cgcc/g++,在编译时默认使用动态链接,如果想要生存静态链接,我们要带上-static。...总结 -I 指明头文件的路径 -L 指明文件的搜索路径 -l 指明要链接哪个,要带上的名称(去掉前缀和后缀) 注意 gcc默认是动态链接,对于一个特定的,究竟是动态链接还是静态链接取决于提供的是动态还是静态...四、制作动态 首先我们将文件全部编译成.o文件,这里与制作静态不同的是,需带上-fPIC,形成位置无关码: gcc -c -fPIC add.c 什么是位置无关码?...总结 以上就是今天要讲的内容,本文介绍了Linux中的动静态的相关概念。

39420

gcc编译成动态_gcc动态

gcc常用编译选项: 选项 含义 -static 链接静态,禁止使用动态 -shared 进行动态编译,链接动态 -Ldir 在动态的搜索路径中增加dir目录 -lname 链接静态(libname.a...)或动态(libname.so)的文件 -fPIC(或fpic) 生成使用相对地址无关的目标代码 方法一: 第一步:使用-shared参数生成动态gcc -shared -fPIC -o libtest.so...test.c 然后把libtest.so复制到/usr/lib64/系统路径下 注意:生成的动态的名字必须是lib+名字.so,之后可以直接使用-ltest来引用动态。...第二步:编译main.c,使用libtest.so动态gcc -o main main.c -L/usr/lib64/ -ltest 方法二: 在编译main.c,并链接libtest.so的时候,...直接指定使用当前目录下的libtest.so文件, 使用命令:gcc -o main main.c .

1.5K60
领券