当前位置:首页 » 编程软件 » 编译动态库

编译动态库

发布时间: 2022-01-10 18:01:30

php动态库怎么编译

# 声称动代连接库,假设名称为libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 将main.c和动态连接库进行连接生成可执行文件
gcc main.c -L. -ltest -o main

# 输出LD_LIBRARY_PATH环境变量,一边动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

# 执行就不用说了吧

--------------------------------------------------
建议创建一个Makefile来作这些事情。

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下,有几个.so。如何将这几个动态库编译成一个动态库

g++ -l*** -l*** -L 库目录. 一次g++ 是可以同时连接多个动态库的.不用把多个动态库编成一个.

⑷ linux 编译怎么连接动态库

Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用-L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用-l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

⑸ openssl怎么编译成动态库

1、静态编译
./Configure linux-elf-arm -DB_ENDIAN linux:'armeb-linux-gcc -mbig-endian' --prefix=$(pwd)/OpenSSL
a、 将openssl-0.9.8d/crypto/bio/bss_file.c中以下代码注释掉
//#ifndef _FILE_OFFSET_BITS
//#define _FILE_OFFSET_BITS 64
//#endif
#endif
b、 报错没有timeb.h时,在报错的.c文件中#undef TIMEB
c、 去掉openssl顶层Makefile中“build_all:”后面的 build_app build_test (我们要的只是两个静态库libcrypto.a和libssl.a),并去掉”DIRS=”后面的app和tests。
make && make install

2、动态库
1.config:
#config no-asm --prefix=../OpenSSL
2.改Makefile
1) CC= gcc 改成 CC = armeb-linux-gcc;
2) 删除 CFLAG= 中的 “-march=pentium”;
3) AR=ar $(ARFLAGS) r 改为 AR=armeb-linux-ar $(ARFLAGS) r;
4) ARD=ar $(ARFLAGS) d 改为 ARD=armeb-linux-ar $(ARFLAGS) d;
5)RANLIB= /usr/bin/ranlib 改为 RANLIB= armeb-linux-ranlib;
3.编译
#make
#make install

⑹ 缺少动态库的情况下,能通过编译吗

>> 如果你是链接动态库,在GCC后跟了一个-l参数,其后就是你所需库的名称,
>> 那么你不仅需要那个你所需的库文件,还需要你所需库的头文件才行,编译时需要头文件支持,
>> 链接时需要库文件,不管你是动态还是静态编译都是如此!!!!
头文件不是必须的。只要没有出现未声明的函数/变量的调用就可以。

>> 还需说明的一点是:只有用参数-o时才会有那个-satic的选项,
>> 也就是说只有在链接程序时才会有动态链接和静态链接之分!!!!!!
没有 -o 也可以 -static。-o 不代表链接

>> 动态链接库是为了减少可执行文件的大小,就是在一个系统中只提供一个库,
>> 可供多个动态链接的程序共同使用
同时也避免库代码被重复加载进入内存,减少系统内存占用

⑺ acc和gcc编译动态库的区别

编译动态库时,acc使用-b开关,gcc使用-share开关,acc使用-AA开关编译标准c++代码,-mt加入多线程链接,gcc使用-pthread开关,acc使用+Markered开关编译出cpp文件所需的头文件,并以xxx.d文件形式存放,acc和gcc的共同的开关有-I加入头文件目录,-l开关加入依赖的动态库链接,-L开关加入动态库搜寻的路径,-o开关输出目标文件,-g开关加入调试信息,-w开关加入警告级别。在64位的机器上,acc使用+DD32开关编译32位程序,gcc使用-milp32编译32位程序,此外,在64位机器上,默认是编译32位的程序。

⑻ 动态库的编译


生成动态连接库,假设名称为libtest.so
gcc x.cy.cz.c-fPIC-shared-olibtest.so
将main.c和动态连接库进行连接生成可执行文件
gcc main.c-L.-ltest-omain
输出LD_LIBRARY_PATH环境变量,以便动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

⑼ 如何编译动态库,该动态库需要链接另外一个动态库

看你的makefile, 猜测是没有指定动态库头文件的路径. -I编译参数来指定

⑽ 如何用gcc编译动态库

今天要用到静态库和动态库,于是写了几个例子来巩固一下基础。
hello1.c ————————————————————
#include <stdio.h>
void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); } }
hello2.c _________________________________________________
#include <stdio.h>
void print2(char *arr) { char c; int i=0; while((c=arr[i++])!='\0') { printf("%d****%c\n",i,c); } }
hello.c ____________________________________________________
void print1(int); void print2(char *);
int main(int argc,char **argv) { int i=100; char *arr="THIS IS LAYMU'S HOME!"; print1(i); print2(arr);
return 0; }

可以看到hello.c要用到hello1.c中的print1函数和hello2.c中的print2函数。所以可以把这两个函数组合为库,以供更多的程序作为组件来调用。

方法一:将hello1.c和hello2.c编译成静态链接库.a
[root@localhost main5]#gcc -c hello1.c hello2.c
//将hello1.c和hello2.c分别编译为hello1.o和hello2.o,其中-c选项意为只编译不链接。
[root@localhost main5]#ar -r libhello.a hello1.o hello2.o
//将hello1.o和hello2.o组合为libhello.a这个静态链接库
[root@localhost main5]#cp libhello.a /usr/lib
//将libhello.a拷贝到/usr/lib目录下,作为一个系统共享的静态链接库
[root@localhost main5]#gcc -o hello hello.c -lhello
//将hello.c编译为可执行程序hello,这个过程用到了-lhello选项,这个选项告诉gcc编译器到/usr/lib目录下去找libhello.a的静态链接库
以上的过程类似于windows下的lib静态链接库的编译及调用过程。
方法二:将hello1.o和hello2.o组合成动态链接库.so
[root@localhost main5]#gcc -c -fpic hello1.c hello2.c
//将hello1.c和hello2.c编译成hello1.o和hello2.o,-c意为只编译不链接,-fpic意为位置独立代码,指示编译程序生成的代码要适合共享库的内容这样的代码能够根据载入内存的位置计算内部地址。
[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so
//将hello1.o和hello2.o组合为shared object,即动态链接库
[root@localhost main5]#cp hello.so /usr/lib
//将hello.so拷贝到/usr/lib目录下
[root@localhost main5]#gcc -o hello hello.c hello.so
//将hello.c编译链接为hello的可执行程序,这个过程用到了动态链接库hello.so

在这里要废话几句,其实一切的二进制信息都有其运作的机制,只要弄清楚了它的机制,并能够实现之,则任何此时此刻无法想象之事都将成为现实。当然,这两者之间的巨大鸿沟需要顶级的设计思想和顶级的代码来跨越。

热点内容
安卓上哪里下大型游戏 发布:2024-12-23 15:10:58 浏览:186
明日之后目前适用于什么配置 发布:2024-12-23 14:56:09 浏览:51
php全角半角 发布:2024-12-23 14:55:17 浏览:826
手机上传助手 发布:2024-12-23 14:55:14 浏览:730
什么样的主机配置吃鸡开全效 发布:2024-12-23 14:55:13 浏览:828
安卓我的世界114版本有什么 发布:2024-12-23 14:42:17 浏览:708
vbox源码 发布:2024-12-23 14:41:32 浏览:275
诗经是怎么存储 发布:2024-12-23 14:41:29 浏览:657
屏蔽视频广告脚本 发布:2024-12-23 14:41:24 浏览:417
php解析pdf 发布:2024-12-23 14:40:01 浏览:816