通常使用自己生成动态或静态库有三种方法,一是将库路径放在/etc/ld.conf相关的文件当中,一是通过修改LD_LIBRARY_PATH,最后还有种方法是用-L -l指定路径。
今天将这几种方式用了下,发现没有LD_LIBRARY_PATH这个环境变量,另外文件到ld.conf当中也没用,所以在以后就用-L -l的方法了,-L是指定你的库路径,-l是指定你库的名字。
还有一种情况需要注意,为了加快动态链接的速度,链接器通常会在ld.so.cache当中寻找,而忽视参数,这个时候需要执行/sbin/ldconfig来更新cache.
动态链接与运行加载描述的是同一件事情,动态链接指在编译的时候告诉gcc需要什么动态链接库,而运行加载则是告诉链接器链接动态库的路径,在一个完整的系统上两个有同样的效果,但使用的时间不同,同时这种做法也使得开发变得十分灵活,在编译链接时用-L,-l来指定所需的库,而在运行加载时在通过LDFLAGS来指定运行加载库,这样看来其实一个简单的动态库中间的过程也非常多,用法如下:
编译:gcc xxx -L xx -lxx
运行时:xxx -L -l (同时可以告诉链接器来完成LDFLAGS="Wl,rpath,xxx")
关于静态链接和动态链接,有一种说法是错误的,即动态链接使用动态库,静态链接使用静态库,看起来像是这样的,但实际上不是的,静态链接是与动态链接的区别在于,前者在编译链接的时候,所有的库都已经放到可执行文件当中去了,而后者是值在运行时才将库加载内存当中去运行(链接时必须指明位置),而后者使用库的方式有两种方式,一种是静态库,另外一种是共享库,静态库和共享库(通常描述为动态库)的区别在与各个进程之间能否共享这个库,为什么这么说?那是因为静态库在链接生成可执行文件的时候在内存当中存放的位置就已经定死了,而共享库的位置却是通过指针来指向的,这样多个进程就可以指向存放在内存当中的同一个共享库了,可以通过反汇编的证实。另外他们还有一个区别,那就是在动态链接的时候最终会调用动态连接器来完成这个事情,然后在返回到源程序。
阅读(4908) | 评论(0) | 转发(0) |