Linux中C/C++动态库、静态库编译

http://blog.csdn.net/qq_17242957/article/details/50382593

http://m.blog.csdn.net/guowenyan001/article/details/50353214

http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html

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/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
-I/usr/openwin/include:指定头文件查找目录


"undefined reference to" 问题解决方法
http://blog.csdn.net/aiwoziji13/article/details/7330333/

https://segmentfault.com/a/1190000006911973

https://segmentfault.com/a/1190000004150343

https://segmentfault.com/a/1190000004907656


静态库链接时搜索路径顺序:
1.ld会去找GCC命令中的参数-L
2.再找gcc的环境变量LIBRARY_PATH
3.再找内定目录/lib,/usr/lib,/usr/local/lib;这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:
1.编译目标代码时指定的动态库搜索路径;elf文件的 DT_RPATH段;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径/etc/ld.so.cache;
4.默认的动态库搜索路径/lib,/usr/lib。

有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
LD_PRELOAD:指定程序运行前优先加载的动态链接库,其优先级比LD_LIBRARY_PATH自定义的进程的共享库查找路径的执行还要早,黑客可用于拦截正常的函数调用。比如LD_PRELOAD=/usr/local/lib64/libasan.so.0。也可以将预先的库设置在/etc/ld.so.preload。
http://blog.csdn.net/haoel/article/details/1602108
http://www.2cto.com/os/201406/306008.html
一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。


ldconfig /usr/zhsoft/lib 
注: 当用户在某个目录下面创建或拷贝了一个动态链接库,若想使其被系统共享,可以执行一下"ldconfig 目录名"这个命令.此命令的功能在于让ldconfig将指定目录下的动态链接库被系统共享起来,意即:在缓存文件/etc/ld.so.cache中追加进指定目录下的共享库.本例让系统共享了/usr/zhsoft/lib目录下的动态链接库.该命令会重建/etc/ld.so.cache文件



http://blog.csdn.net/xiliang_pan/article/details/50903781

http://blog.chinaunix.net/uid-20682147-id-3760647.html


http://blog.csdn.net/dumgeewang/article/details/7403084/

http://www.cnblogs.com/dadawei/p/5368380.html

http://www.jb51.net/article/37409.htm

https://www.oschina.net/question/129540_31276

http://blog.csdn.net/wangwenwen/article/details/7308073

https://zhidao.baidu.com/question/138392949160925805.html


.a


.so (shared object)


strings /lib/libc.so.6|grep GLIBC

ldd
nm




你可能感兴趣的:(C/C++,Linux)