Static, Shared Dynamic and Loadable Linux Libraries
Shared libraries and static libraries
Creating a shared and static library with the gnu compiler [gcc]
创建静态库(.a)
比如为了把foo1.o, foo2.o这两个obj文件打包成一个静态库叫做foo.a
$ gcc -Wall -c foo1.c foo2.c $ ar -cvq libfoo.a foo1.o foo2.o创建动态库(.so)
首先用-fPIC选项告诉gcc生成position independant code的.o文件
$ gcc -Wall -fPIC -c foo1.c foo2.c接着使用-shared选项生成.so文件
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.1 foo1.o foo2.o使用库(.a,.so)
假设生成的libfoo.a或者libfoo.so都在/path/to/libfoo这个路径下,可以通过"-L/path/to/libfoo"这个选项告诉gcc去这个路径下去寻找需要的库.此外再通过-lfoo这个选项告诉gcc去寻找libfoo.a或者libfoo.so.
$ gcc -Wall -L/path/to/libfoo your-program.c -lfoo -o your-program默认情况下/usr/lib, /usr/local/lib这个几个路径一般会被首先查找.如果需要gcc去其他默认路径下查找(比如/path/to/libfoo),也可以通过把/path/to/libfoo添加LD_LIBRARY_PATH环境变量中
强制使用静态库(.a)
如果在/path/to/libfoo下同时存在libfoo.a和libfoo.so, libfoo.so会被优先使用.可以用-static选项强制gcc避免使用动态库
$ gcc -Wall -static -L/path/to/libfoo your-program.c -lfoo -o your-programlibtool
configure关于静态动态库的参数
- --enable-shared: 编译动态库(默认为yes)
- --enable-static: 编译静态库(默认为no)
$ ./configure --enable-static warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/libcrypto.a(c_zlib.o): In function `bio_zlib_free': (.text+0x4f): undefined reference to `inflateEnd'可以以--enable-static=libfoo这样的方式指定gcc只以static的方式编译libfoo.其他依赖的库还是以默认的shared方式编译(http://sourceware.org/autobook/autobook/autobook_85.html)
$ ./configure --enable-static=libfoolibtool在link模式下有选项:
- -shared
- -static
- -all-static
No comments:
Post a Comment