在Linux下工作了几年,都是一些环境较成熟的产品,无需自己搭建makefile,新增文件只要在makefile里面加入XXX.cc就行了,对静态库与动态库的理解也只是概念上的。新公司里的makefile简直是团mess,甚至编译都通不过,只得自己去整理makefile,顺便研究了下静态库与动态库。
1.       静态库
静态库是将编译出来的.o文件打包成libXXX.a的格式,使用静态库时通过-L指定路径,-lXXX引用库。相信libXXX.a是g++默认的搜索命名方式。静态库是在链接阶段被引入的,运行阶段不需要库的存在,但编译阶段需要头文件的存在,否则出现未声明错误。即编译(头文件)+链接(库文件)+运行(什么也不需要)。如果不想使用静态库,能找到编译出来的.o的话,直接使用.o也行,连-L, -l都省了,如g++ -o main main.cc XXX.o。
2.       动态库
动态库有二种使用方式(之前我以为只有一种dlopen的方式)。
第一种方式是编译时使用动态库,要使用-L与-l。也是将编译出来的.o(与编译静态库的.o不一样,这里要加-fpic选项)打包成libXXX.so。这种方式在编译时看不出使用的动态库还是静态库。编译(头文件)+链接(库文件)+运行(库文件)。
第二种方式是在代码中通过dlopen使用动态库,编译+链接+运行(库文件)。这种方式在编译时无需知道动态库的任何信息,但编程者要知道库文件的函数原型(库文件的函数还要extern “C”,否则在运行时,dlsym会报找不到函数的错误,可能dlopen函数族是对C设计的,不支持C++)。

实例:
生成".o"文件
1106 gcc -c hello.c -fPIC -I ./

生成静态库".a"
1087 ar cr libmyhello.a hello.o
1092 g++ -o hello main.cpp -L. -lmyhello -I ./

动态库".so"
1107 g++ -shared -fPCI -o libmyhello.so hello.o
1108 g++ -o hello main.cpp -L. -lmyhello -I ./
1110 export LD_LIBRARY_PATH=./
1111 ./hello

动态库执行
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
./hello

posted on 2015-10-22 19:43  步孤天  阅读(171)  评论(0编辑  收藏  举报