linuxc编译静态库
Linux系统中静态库是.a文件,编译链接.a文件只需要加上.a文件的完整的文件路径就可以了,比如:
gcc -o hello hello.c /usr/lib/libm.a
Linux系统的动态库是系统中的.so文件,编译链接动态库需要用-L参数指定动态库的搜索路径,还要用-l(这个是小写的L)指定动态库的名字,比如:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto
② linux静态库怎么编译
创建并使用静态库
第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
vi test.h test.c main.c
第二步:将test.c编译成目标文件。
gcc -c test.c
如果test.c无误,就会得到test.o这个目标文件。
第三步:由.o文件创建静态库。
ar rcs libtest.a test.o
第四步:在程序中使用静态库。
gcc -o main main.c -L. -ltest
因为是静态编译,生成的执行文件可以独立于.a文件运行。
第五步:执行。
./main
示例四 创建并使用动态库
第一步:编辑源文件,test.h test.c main.c。其中main.c文件中包含main函数,作为程序入口;test.c中包含main函数中需要用到的函数。
vi test.h test.c main.c
第二步:将test.c编译成目标文件。
gcc -c test.c
前面两步与创建静态库一致。
第三步:由.o文件创建动态库文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用动态库。
gcc -o main main.c -L. -ltest
当静态库和动态库同名时,gcc命令将优先使用动态库。
第五步:执行。
LD_LIBRARY_PATH=. ./main
示例五 查看静态库中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o
③ Linux C编译生成的Object文件(.o)文件,是否相当于java的JAR之类的库文件
虽然我不懂java,但是Linux C编译生成的.o文件是二进制可重定位文件,把一些相关的打包成.so(动态库)或是.a(静态库),其实只是简单的打了一个包,没有什么其它复杂处理。如果谁调用了,其中的函数之类的东西,就需要链接到这个库文件或者.o文件,这样生成二进制可执行文件
④ 如何生成静态库和动态库
静态库
静态库的后缀是.a,它的产生分两步
Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表
Step 2.ar命令将很多.o转换成.a,成为静态库
动态库的后缀是.so,它由gcc加特定参数编译产生。具体方法参见后文实例。123123
在 GNU/Linux 系统中静态链接文件实际上就是多个 .o 文件的压缩包。假设我们有 cool.h cool.c 和 some.c 文件,要得到静态链接库 libcool.a。首先使用如下指令得到相应的 object 文件 cool.o 和 some.o:
gcc -c cool.c
gcc -c some.c1212
用这种方法生成的 object 文件称为 PDC 即位置相关代码(position-dependence code)。再使用如下指令可以得到静态链接文件 libcool.a:
ar -r libcool.a cool.o some.o
ranlib libcool.a1212
静态链接库 libcool.a 遵从 GNU/Linux 规定的静态链接库命名规范,必须是”libyour_library_name.a”
动态库
在 GNU/Linux 中动态链接文件,必需通过链接器 ld 生成。假设我们有 hot.c other.c 等文件要生成动态链接库 libhot.so 。首先使用如下指令得到相应的 object 文件 hot.o 和 some.o
gcc -fPIC -c hot.c
gcc -fPIC -c other.c1212
参数 -fPIC 指定生成的 object 文件为位置无关代码(position-independence code),只有 PIC 可以被用作生成动态链接库。然后使用如下指令得到动态库:
ld -Bshared -o libhot.so hot.o other.o11
或者可以使用编译器的ld wrapper:
gcc -shared -o libhot.so hot.o other.o11
也可以使用编译器直接生成动态库:
gcc -fPIC -shared -o libhot.so hot.c other.c11
这里选项 -shared 指示目标文件的类型是动态链接库,动态库的命名规范是”libyour_library_name.so”
⑤ 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 静态库和动态库编译的区别
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