linux库链接库
linux下的mysql,一般提供2个库:libmysqlclient.so 和 libmysqlclient_r.so
其中ibmysqlclient_r.so 是 libmysqlclient.so 的多线程安全版本
因为安装时系统环境和指定的路径可能不同,这2个库的路径可能在以下4个目录内
/usr/lib/mysql/
/usr/lib64/mysql
/usr/lib/
/usr/lib64/
‘贰’ 怎么条用linux中动态链接库里面的函数
在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。
当库被装入后,可以把
dlopen()
返回的句柄作为给
dlsym()
的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。
‘叁’ linux 怎么指定静态链接静态库
创建静态库: ar -rcs test.a *.o 查看静态库: ar -tv test.a 解压静态库: ar -x test.a 查看程序依赖的动态库: readelf -a xxx|grep library 如:可以看到,下面的交叉程序hello执行依赖于如下两个动态库。 rebi@ubuntu:~/test$ arm-none-li...
‘肆’ 在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)
以常见的mysql和oracle这两种数据库为例:
一、连接mysql(mysql服务已开启)
1、mysql数据库安装在本机,则直接敲入命令mysql-uroot-p即可。
2、mysql数据库不是安装在本机,则需要加参数,常用参数如下:
1),-h,指定目标ip地址
2),-u,指定登录用户名。
3),-p,指定密码,密码可以接在-p后面输入mysql-uroot-p123456。也可以mysql-uroot-p回车等提示输入密码时输入,这样输入密码没有回显。
二、连接oracle数据库
1、若当前用户为root用户,则需要执行命令su-oracle切换至oracle用户;若当前用户为oracle用户则此步骤省略。
2、若oracle安装在本机,则在oracle用户下直接执行sqlplususername/password(username,password替换成真实的用户名和密码)数喊,若提示connected则表示连接成功;
3、若oracle安装在其他机器,则在oracle用户下执行sqlplususername/password@//host:port/sid。host为oracle所在机器的ip或者机器名,port为端口号,通常为1521,sid指oracle的实例名。
(4)linux库链接库扩展阅读:
linux下操作数据库(以mysql为例)的其他命令
一、linux下查穗举看mysql服务的命令两种方式:
1、[root@localhostbin]ps-ef|grepmysql
2、[root@localhostbin]netstat-nlp
二、linux下启动mysql服务的两薯族野种方式:
1、命令方式:
[root@localhostbin]cd/usr/bin
[root@localhostbin]./mysqld_safe&
2、服务方式:
[root@localhost~]servicemysqlstart
如果服务在启动状态,直接重启服务用以下命令:[root@localhost~]servicemysqlrestart
三、linux下关闭mysql服务的两种方式:
1、命令方式:
[root@localhost~]mysqladmin-urootshutdown
2、服务方式:
[root@localhost~]servicemysqlstop
‘伍’ linux下怎么连接mysql数据库(linux连接数据库)
1、首先确保linux下mysql安装好,服务启动完之后,就丛巧激宽悔可以开始连接数据库了。在终端输入“mysql-hlocalhost-uroot-p”,其中h参数是主机名,这里是本地就写localhost,也可以省略:
2、输入mysql的密码之后就登录了,也可以不输入密码登录,比如这里的root密码是mysql123456,可以直接输入“mysql-hlocalhost-uroot-”,此时就没有提示输入密码,直接进入mysql的命令行中了:
3、此时显示的就是mysql的命令行界面了,若渗袜要退出输入quit就可以退出了。以上就是linux中连接数据库的操作:
‘陆’ 面试 | Linux 下的动态链接库问题
在 Linux 开发时,我们经常会看到一些形如 xxx.so 的名称出现,其中 so 是 Shared Object 的缩写,即可以共享的目标文件,也就是我们所称为的动态链接库,和在 Windows 下大家玩 游戏 时遇到的 xxx.dll 错误中的文件是一个类型的。
面试中经常会问到以下问题:
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
库有两种:
在一个程序的编译过程中,分为以下几个步骤: 预处理 , 编译 , 汇编 , 链接 。本文中讨论的链接库就是针对最后一个步骤“链接”而言的。
动态库和静态库的区别
左图为静态链接库,右图为动态链接库
对于静态链接库而言在链接阶段,会将汇编生成的“目标文件.o”与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接:
静态链接可以理解为最后生成了一个“单文件免安装绿色版”的程序,优点在于移植的时候只需要移动这一个文件,缺点在于文件体积非常大,为了解决这样的问题,就有了动态链接库。动态链接库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
动态库连接到系统空间,如果多个程序连接了同一个库,那么只需要一份,优点在于编译程序的时候不会将对应的库文件全部打包在生成的程序中,而是保留了到对应库的链接,缺点就是移植的时候如果只移动了对应的程序没有安装相关的库的话,就会看到类似以下喜闻乐见的结果了。
在 Linux 下一个动态库有y三个不同名字的文件组成:
当程序在内部列出所需要的链接库时,仅仅使用 soname。当你创建一个链接库时,使用 real name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfig。ldconfig 检查存在的 real name 文件,并且创建指向它符号链接 soname 文件。可能大家比较常见到的有 libsodium 等。
有了上面关于库的一些基础知识之后,我们可以开始尝试创建一个动态库来供程序使用了。
比如我们有一个求最大值的函数 max(int a,int b,int c) ,放在文件 max.c 中文件内容如下:
可以通过:
将其编译为共享库,-fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; -shared是链接选项,告诉 gcc 生成动态库而不是可执行文件。为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件,比如可以写一个 max.h :
设置一个驱动函数来测试我们编写的动态库:
通过 gcc test.c -L. -lmax来生成 a.out,其中-lmax表示要链接 libmax.so,-L.表示搜索要链接的库文件时包含当前路径。
但是这样直接运行的话,会出现一个错误:
由于 Linux 是通过/etc/ld.so.cache文件搜寻要链接的动态库的,而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的,本次使用的动态库 libmax.so 并不在对应的目录下,就会导致程序无法找到对应的动态链接库,这样我们的解决方法有二:
小结
动态链接库是各个系统中的一个重要的组成部分且在 Linux 开发相关领域中尤为重要,也是一个面试的高频考点,除了动态链接库以外,还有以下相关知识也是高频考点,在面试前一定要准备好:
本文作者:Nova Kwok
‘柒’ 关于linux下连接动态库问题
gcc编译时,当使用动态库编译可以按照几种写法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的编译参数都是按照2或3去写
2写法的含义是从/lib或者/usr/lib目录下寻找名称为SDL2-2的库,即寻找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件进行链接,当然如果没有动态库就会去找静态库,再没有应该就会在编译时报错
3写法的含义是从-L参数首先从指定的目录中寻找需要链接的库文件,随后再去寻找系统文件夹中是否存在需要的库
1写法的含义是将当前目录下的./libSDL2-2.so.0文件链接进最终文件,因此执行readelf -a a.out后在动态库部分所看到的路径就是./libSDL2-2.so.0,进而在执行文件时仅会从当前目录下寻找libSDL2-2.so.0文件,当执行文件时所在的目录下没有该文件时就会出现找不到库文件的操作
你第二次操作时,因为function.so库文件与a.out文件在同一个目录,同时也是在该目录下执行的ldd操作及运行a.out,a.out在加载动态库时从当前目录下找到了所需要的库文件,此时能够执行成功(ldd命令实质是一个脚本,通过设置环境变量运行动态库链接器来输出所有待链接的动态库)。
你可以试试将a.out拷贝至其他目录再次运行,将出现和第一次操作时一样的现象,找不到function.so文件。
具体的解决方法就是修改编译参数,将./libSDL2-2.so.0修改为-lSDL2-2并将libSDL2-2.so.0文件拷贝至/usr/lib目录下,并且可能因为没有修改链接器的缓存文件(将可能找不到带版本号后缀的动态库),需要在/usr/lib目录下建立一个文件连接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名称为libSDL2-2.so