.so 是 "shared object" , 它缺并用于动态链接。.so 更或信新时,程序不需重新编译。
kill掉相应的余配岩进程,或者停掉使用这个文件的应用,让os自己主卖桐动回收磁盘空间我这个环境有非常多进程在使用的这个文件,停掉进程有点麻烦,再有就是风险非常大
当linux打开一个文件的时候,Linux内核会为每个进程在/proc/ 『/proc/nnnn/fd/文件夹(nnnn为pid)』建立一个以其pid
为名的文件夹用来保存进程的相关信息,而其子文件夹fd保存的是该进程打开的全部竖御文件的fd(fd:file descriptor)。
除此之外, 在AIX 平台,系统提供了丰富的工具创建动态库。 从大的范围看有两种不同的方法可以创建动态库,一种是按照传统的方式,编写输出符号 文件,创培伍建动态库。另一种可通过编译器提供的参数选项,自动生成输出符号文件创建动态 库。将逐一给出介绍。 按照传统的方法创建动态库,关键的问题是如何编写输出符号文件,Visual Age C/C++ 这一产品给我们提供了一个比较好的工具CreateExportList 帮助我们完成。参考下面的例子, 将给出详细的步骤说明,如何创建输出符号文件。 测试用例为C 程序文件,文件名为show.c 和trans.c ,源码分别为: /* ** show.c */ #include void show(char *pt){ printf("The showing text : %s/n", pt)} /* ** trans.c */ #include void trans(char *str1) { char str[20]strcpy(str, str1)show(str)} 上面的两个示例程序中,show.c 包含函数show() ,trans.c 包含函数 trans() ,借助于CreateExportList 工具,首先生成输出符号文件,步骤如下: 1 )编译源程序show.c 和trans.c xlc –c show.c xlc –c trans.c 生成相应的目标文件show.o 和trans.o 2 )创建包含目标文件的纯文本文件 创建此文件的目的是帮助我们收集动态库包含的目标文件,这一步并不是必需的,假设文件名为 objlist ,内容如下: show.o trans.o 3 )创建输出符号文件,文件包含动配滑或态库要输出的所有符号,假定文件名为exp.f /usr/vac/bin/CreateExportList exp.f –f objlist 如果没有objlist 文件,也可以将目标文件逐一列示: /usr/vac/bin/CreateExportList exp.f show.o trans.o 查看文件exp.f 内容为: show trans 4 )编辑输出符号文件,在文件起始处增加#! 动态库名行,假定要创建的动态库名为libct.so ,如下: #!libct.so 5 )编辑输出符号文件,删除不希望输出的符号。CreateExportList 创建的输出文件可能包含所有的函数, 无论是调用的还是被调用,需要删除掉不希望输出的符号,或调用的系统函数。 输出符号文件创建完成后,接下来,就可以创建动态库了。前面已经提过,动态库是 由编译器创建的,这一点与静态库的创建有本质的区别,如下: xlc –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o 本质上,这是有ld 完成的,xlc 只是将参数传递给ld 。这可以节省部分工作,这是因为,相对于xlc ,ld 是 比较最底层的 *** 作,需要对系统提供的库比较熟悉。如果直接使用ld ,必须要清楚,创建库需要的所有资源。 假如我们简单让竖的将以上命令的xlc 替换为ld ,请看以下输出结果: [root@ibmp630#]ld -bE:exp.f -bnoentry -bM:SRE -o libct.so show.o trans.o ld: 0711-317 ERROR: Undefined symbol: .printf ld: 0711-317 ERROR: Undefined symbol: .strcpy ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information 正确的使用命令,如下: ld –bE:exp.f –bnoentry -bM:SRE –olibct.so show.o trans.o –lc 至此,按照传统的方法创建动态库已经完成。可以看到,以上的步骤比较多,且 繁琐,实际上Visual Age C/C++ 同样提供了一种相对简单的方法,只需使用编译参数-G 即可,步骤分析如下: 1 ) 编译源程序 xlc –c show.c xlc –c trans.c 2 ) 创建动态库 xlc –G –olibct.so show.o trans.o 这种方法,简单明了,省掉好多重复的 *** 作。 以上,介绍了动态库的创建方法,可以用下面的例子测试创建的动态库: int main() { show("test show")trans("test trans")return 0} 这是一个很简单的例子,通过函数调用测试一下动态库能否使用 xlc –brtl –o test main.c –lct –L. 运行test 程序,结果如下: [root@ibmp630#]./test The showing text : test show The showing text : test trans 对C++ 的程序,创建动态库的方法与上面一致,区别在于编译器应使用xlC ,符号输出文件使用 /usr/vacpp/bin/CreateExportList 创建。除以上介绍的方法外,也可以使用工具/usr/vacpp/bin/makeC++SharedLib 创建。 总之,动态库的创建是一个比较复杂的过程,也有可能会出现创建完动态库后,不能使用的情况。以上,只 是一个比较通用的方法欢迎分享,转载请注明来源:内存溢出
评论列表(0条)