Content #
有libfoo1.c和libfoo2.c两个源代码文件,希望产生一个libfoo.so.1.0.0的共享库,这个共享库依赖于libbar1.so和 libbar2.so这两个共享库,可以使用如下命令行:
$gcc –shared -fPIC –Wl,-soname,libfoo.so.1 –o libfoo.so.1.0.0 \
libfoo1.c libfoo2.c -lbar1 -lbar2
当然我们也可以把编译和链接的步骤分开,分多步进行:
$gcc –c –g –Wall –o libfoo1.o libfoo1.c
$gcc –c –g –Wall –o libfoo2.o libfoo2.c
$ld –shared –soname libfoo.so.1 –o libfoo.so.1.0.0 \
libfoo1.o libfoo2.o –lbar1 –lbar2
几个值得注意的事项:不要把输出共享库中的符号和调试信息去掉,也不要使用GCC的“-fomit-frame-pointer”选项,这样做虽然不会导致共享库停止运行,但是会影响调试共享库,给后面的工作带来很多麻烦。
在开发过程中,你可能要测试新的共享库,但是你又不希望影响现有的程序正常运行。我们前面提到的LD_LIBRARY_PATH是一个很好的方法,用它可以指定共享库的查找路径。还有一种方法是使用链接器的“-rpath”选项(或者 GCC的-Wl,-rpath),这种方法可以指定链接产生的目标程序的共享库查找路径。比如我们用如下命令行产生一个可执行文件:
$ld –rpath /home/mylib –o program.out program.o –lsomelib
这样产生的输出可执行文件program.out在被动态链接器装载时,动态链接器会首先在“/home/mylib”查找共享库。
From #
程序员的自我修养