Linux中CC++动态库、静态库编译
gcc helloworld.cpp -lstdc++ 或 g++ helloworld.cpp
所谓链接,也就是说编译器到程序中所引⽤的函数或全局变量所存在的位置。程序的链接分为静态链接和 动态链接,静态链接就是把所有所引⽤到的函数或变量全部地编译到可执⾏⽂件中。动态链接则不会把函数编译到可执⾏⽂件中,⽽是在程序运⾏时动态地载⼊函数库,也就是运⾏链接。
静态库libxxx.a在程序编译时会被连接到⽬标代码中,程序运⾏时将不再需要该静态库。
动态库libxxx.so在程序编译时并不会被连接到⽬标代码中,⽽是在程序运⾏是才被载⼊,因此在程序运⾏时还需要动态库存在。
链接时当静态库和动态库都存在时, gcc命令将优先使⽤动态库。
# compile static library
gcc -c hello.c
ar cr libmyhello.a hello.o
gcc -o hello main.c -L. -lmyhello
# compile dynamic library
gcc -fPIC -c hello.c
gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. -lmyhello
“-fPIC”命令⾏标记告诉GCC产⽣的代码不要包含对函数和变量具体内存位置的引⽤,这是因为现在还⽆法知道使⽤该消息代码的应⽤程序会将它连接到哪⼀段内存地址空间。这样编译出的hello.o可以被⽤于建⽴共享链接库。建⽴共享链接库只需要⽤GCC的”-shared”标记即可。
最主要的是GCC命令⾏的⼀个选项:
-shared 该选项指定⽣成动态连接库(让连接器⽣成T类型的导出符号表,有时候也⽣成弱连接W类型的导出符号),不⽤该标志外部程序⽆法连接。相当于⼀个可执⾏⽂件
-fPIC:表⽰编译为位置独⽴的代码,不⽤此选项的话编译后的代码是位置相关的,所以动态载⼊时是通过代码拷贝的⽅式来满⾜不同进程的需要,⽽不能达到真正代码段共享的⽬的。
-L.:表⽰要连接的库在当前⽬录中,否则GNU连接器会查标准系统函数⽬录
-ltest:编译器查动态连接库时有隐含的命名规则,即在给出的名字前⾯加上lib,后⾯加上.so或.a来确定库的名称
LD_LIBRARY_PATH:这个环境变量指⽰动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/f⽂件,然后调⽤ /sbin/ldconfig来达到同样的⽬的,不过如果没有root权限,那么只能采⽤输出LD_LIBRARY_PATH的⽅法了。
-I/usr/openwin/include:指定头⽂件查⽬录
ldconfig /usr/zhsoft/lib
注: 当⽤户在某个⽬录下⾯创建或拷贝了⼀个动态链接库,若想使其被系统共享,可以执⾏⼀下"ldconfig ⽬录名"这个命令.此命令的功能在于让ldconfig将指定⽬录下的动态链接库被系统共享起来,意即:在缓存⽂件/etc/ld.so.cache中追加进指定⽬录下的共享库.本例让系统共享
了/usr/zhsoft/lib⽬录下的动态链接库.该命令会重建/etc/ld.so.cache⽂件
.a
linux下gcc编译的四个步骤.so (shared object)
strings /lib/libc.so.6|grep GLIBC
ldd
nm
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论