linux操作系统下编译静态库与动态库
linux的库文件分为两种,一种是静态库(*.a文件,相当于Windows下的*.lib文件),另一种是动态库(*.so文件,相当于Windows下的*.dll文件)。编译时,一种就是把自己编译的.o文件(相当于Windows下的.obj文件)和静态库一起链接成可执行文件,另一种就是只编译.o文件,当运行时,调用动态库中的函数时,再载入动态库。
编译方法如下:
1. 静态库
假如源文件件为:main.c, mystatic.c。
1) 将mystatic.c编译成静态库libmystatic.a,在main.c中调用此库中的函数。
gcc -c -I inlcude -o mystaic.o mystatic.c // 将mystatic.c编译成目标文件mystatic.o
ar -rs lib/libmystaic.a mystatic.o // 将目标mystaic.o加入libmystatic.a库中(库文件需以lib开头),如果libmystatic.a不存在创建此库
2) 再将main.c编译成可执行文件test。
gcc -I include -L lib -o test main.c -lmystatic -static
则编译成功,在文件夹lib下成功生成libmystatic.a的库文件,并编出的可执行程序test运用了库libmystatic.a
2. 动态库
源文件件为:main.c, mydynamic.c。
1) 将mydynamic.c编译成动态库libmydynamic.so,在main.c中调用了此库中的函数。
gcc -I include -shared -o lib/libmydynamic.so mydynamic.c // 库文件需以lib开头
2) 将main.c编译成可执行文件test。
gcc -I include -L lib -o test main.c -lmydynamic // 不带参数-static,默认为动态编译
3) 运行可执行程序test。
在运行程序test时,系统会在系统默认的库文件目录下搜索mydynamic.so,如果找不到运行失败。需将刚才编译的动态库目录加入系统,具体方法如下:
修改~/.bash_profile(此文件为隐藏文件,用ls -a ~/可将其显示出来)文件,在文件末尾加入:
LD_LIBRARY_PATH=*** #(***为libmydynamic.so所在的目录)
export LD_LIBRARY_PATH
重新登入系统,运行可执行文件test文件将会成功。
3.编译时要使用共享库dl 其中有dlopen dlsynm dlerror dlclose 函数