1. linux 把动态库(libxxx.so)进行静态链接
不行的。要静态链接就要使用静态库(libxxx.a).
2. linux为什么一个动态库链接另一个动态库不行
没看明白问题
如果是被调程序加载动态库,那是自动的,由主调进程环境变量决定。
如果是主调程序加载动态库,则需dlopen打开文件,dlsym按符号获取映射地址,也就是函数或全局数据地址。
3. linux动态库可以不以lib开头吗
可以,lib 开头只是为了方便。例如 gcc 想要调用 libfoobar.so 的函数只要加 -lfoobar 就行了,如果不是lib开头的需要完整写出 libfoobar.so,不能用 -l参数。
4. 什么是linux中的SO动态库
so动态链接库是对它有依赖关系的程序运行时需要调用的,可以通过命令:
ldd “程序名字”来查看程序调用了哪些动态链接库,系统默认会自动加载/usr/lib/ 等目录下的动态链接库,如果是源码安装的库,它的动态链接库文件会存在你自定义安装的目录的lib下,这时你需要修改/etc/ld.so.conf文件来指定动态链接库的加载路径,然后运行ldconfig命令来加载动态链接库,ldconfig -v是查看那些动态链接库已经被加载了
5. 如何在linux实现动态的更新一个动态库
1。可行
2。采用版本标记加软联接的办法.如下:
0)将B.so改名为B.so.1,然后命令行执行ln -s B.so B.so.1
1)用B.so下载新的so,起名为B.so.2
2)生成一个脚本,内有: ln -s B.so B.so.2
3)执行此脚本,可以放到rc.local中,下次开机自动执行.
6. linux下,有几个.so。如何将这几个动态库编译成一个动态库
g++ -l*** -l*** -L 库目录. 一次g++ 是可以同时连接多个动态库的.不用把多个动态库编成一个.
7. linux动态库和静态库的区别
静态库:这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
动态库:这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
8. linux中如何将动态链接库嵌入到可执行程序
动态库是运行时加载,动态库有自己的加载路径;运行时会从固定路径加载;
即需要把动态库放到固定路径下;
比如linux的/lib/目录下
9. linux下的动态库是如何在程序运行时加载
直接上代码,祈祷排版不要乱掉,一下源码来自http://lameck.blog.163.com/blog/static/388113742011111591750149/
//test.h
#ifndef_TEST_H_
#define_TEST_H_
typedefint(*TEST_FUN)(void);
#endif
//test.cgcc-ctest.c-otest.o
//gcc-sharedtest.o-olibtest.so
#include<stdio.h>
#include"test.h"
inttest_fun(void)
{
printf("thisisatest! ");
return0;
}
//main.cgccmain.c-omain-ldl
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
#include"test.h"
intmain()
{
void*handle=NULL;
TEST_FUNp=NULL;
char*error=NULL;
handle=dlopen("./libtest.so",RTLD_LAZY);
if((error=dlerror())!=NULL)
{
printf("%s ",error);
exit(1);
}
p=(TEST_FUN)dlsym(handle,"test_fun");
if((error=dlerror())!=NULL)
{
printf("%s ",error);
dlclose(handle);
exit(1);
}
p();
dlclose(handle);
return0;
}
主要函数
void * dlopen( const char *pathname, intmode);
void* dlsym(void* handle,const char* symbol);
const char *dlerror(void);
int dlclose (void *handle);
这些基本上可以从函数签名中得到实际功能和使用方法..
除了mode参数,其他的想必能够通过阅读源代码来学习吧
关于dlopen的mode参数有如下几个常量:
1、解析方式
RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。
RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为:: undefined symbol: xxxx.......
2、作用范围
RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库重定位。
RTLD_LOCAL: 与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。
3、作用方式
RTLD_NODELETE: 在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。这个flag不是POSIX-2001标准。
RTLD_NOLOAD: 不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag,如:先前加载库的flag为RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)后flag将变成RTLD_GLOBAL。这个flag不是POSIX-2001标准。
RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。这个flag不是POSIX-2001标准。