导航:首页 > 源码编译 > linux编译静态库

linux编译静态库

发布时间:2022-02-16 04:35:21

linux静态库怎么编译

linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so
libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:
libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc
-c
hello.c
-o
hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立两个符号连接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc
-shared
参数使其生成是动态库而不是普通执行程序。
-wl
表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有
soname名字的文件,%b

㈡ LInux 如何使用GCC编译器将一个文件夹下的100个.o文件打包成一个静态库文件(.a)

你已经用gcc编译出目标文件了,用ar工具打包成.a文件就行了啊,示例:


如上图,假设我有test1.c,test2.c两个源文件,先使用gcc -c *.c将源文件编译成目标文件,可以看到,生成了test1.o,test2.o两个目标文件,然后,使用ar命令:ar crv libtest.a *.o将该目录下的所有目标文件打包生成了libtest.a文件。这样,你在编译的时候就可以直接使用这个静态库了。

㈢ linux a 静态库 怎么设置

Linux的静态库文件并不需要设置啊,编译链接.a静态库文件时只需要加上.a文件的完整路径就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
只有编译链接动态库才需要用-L选项来设置动态库的搜索路径,比如这个命令:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto

㈣ Linux2.6 如何编写Makefile,使驱动程序能够编译链接静态库

就我的感觉,静态库是编译好的.o文件,你只要将静态库(mylib.a)放置于 /lib 以及/usr/lib 文件夹下,然后在gcc编译器的变量中 加上 -lmylib,就可以了。

㈤ linux 动态库转为静态库

libc 和 lib-linux 这两个最基本的库都没有,请问其他电脑上跑的是linux吗?没有这两个库,没有一个程序可以运行。

另外,不可能把已有的动态库“直接”转换成静态库,你只能从源码编译出静态库。

㈥ 如何编译生成和调用静态库

如何编译动态库
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用动态库
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要库的路径
-l:表示需要库的名称,如libtest.so,名称则为test
)
(ps:执行a.out时有可能提示找不到libtest.so文件,这时需要把库文件放入到/lib等目录下,或者添加环境变量LD_LIBRARY_PATH,包含有库文件的路径即可)

如何编译静态库
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用静态库
gcc main.c -static -L. -ltest -o a.out

-static:可强制编译时使用静态库,如果不使用这个参数,而静态库与动态库同名的话,会优先使用动态库

㈦ linux下编译怎么链接静态库

静态库不能被打包到.o 文件 在C编译中, 是.c编译成.o,然后若干个.o打包成.a .a要比.o高一级的。 所以不能产生新的.o 你可以把.a文件解开 成为.o集合 加上你的.o文件, 共同打包成一个新的.a文件 这样是可行的。

㈧ linux下编译的静态库可不可以在unix下用

你已经用gcc编译出目标文件了,用ar工具打包成.a文件就行了啊,示例: 如上图,假设我有test1.c,test2.c两个源文件,先使用gcc -c *.c将源文件编译成目标文件,可以看到,生成了test1.o,test2.o两个目标文件,然后,使用ar命令:ar crv libtest.

阅读全文

与linux编译静态库相关的资料

热点内容
纸质电话数据加密法 浏览:172
linux弹出光盘命令 浏览:258
java加密jar包防止反编译 浏览:397
redhatlinux安装mysql 浏览:691
怎么把word和ppt放在一个文件夹 浏览:139
pdf优化器 浏览:131
剪力墙柱钢筋搭接需要加密吗 浏览:873
萤石云加密视频怎么播放 浏览:983
winar如何压缩内存占小 浏览:727
哪里有大的解压软件 浏览:583
一个云服务器如何放多个网站 浏览:326
圆柱体重计算法 浏览:234
谷歌服务器解析地址 浏览:701
应届毕业生程序员实习期怎么过 浏览:707
板石楼梯计算法 浏览:436
swift开发pdf 浏览:294
ideajava编译版本 浏览:965
迈普交换机常用命令 浏览:181
删除创建的文件夹命令 浏览:185
linuxmysql连接拒绝连接 浏览:823