现在工作项目需要都是C/C++ ,开发提供的是so库,因此除了正常功能外,其so库与其他so库兼容性也要进行测试(因为使用so库发现与libmysqlclient.so 编译会错误,因此给测试部门提出测试其兼容性)
目前使用场景确定的是各数据库的so库
一、基础知识学习
但是本人小白对着根本不理解?,因此从gcc 命令开始学习
1、gcc 是什么?书面介绍含义 GNU Compiler Collection, c语言或其他语言编译器
2、so是什么? so是linux下的程序函数库,类似于Windows下dll。so就是动态链接库是c/C++编译出来的。一般来说so文件无法直接运行。
3、gcc 常用的命令含义
使用gcc 编译器时,必须给出一系列必要的调用参数和文件名称,不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需考虑。若使用多个-L参数,gcc会根据-L参数的先后顺序来执行相应的库目录。
gcc [options] [filenames]
-c :只进行编译,不链接成可执行文件。编译器只是由输入的.c等源文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件
-o out_filename :确定输出文件的名称为out_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc 默认给很粗可执行文件a.out
目前执行过相关命令 gcc test.c libhs.so
-g: 产生符号调试工具(gdb),如果你需要对源码进行调试可以尝试使用这个命令。(目前没用到)
-O :对程序进行优化编译链接,采用这个厢,整个源代码会在编译链接中进行优化处理,这样产生的可执行文件的效率更高,但是编译链接的速度相应要慢一些。
-O2: 比-O更好的优化编译、链接
下面是我看的这个大牛的详细解释:
二、编写程序,测试自己so库与常见so库的兼容性
1、测试libXX.so库与 libmysqlite3.so的兼容性
- 安装 sudo apt-get install sqlite3
- 安装 sudo apt-get install libsqlite3-dev
同时将libmysqlite3.so库文件存放在/usr/lib/x86_64-linux-gnu目录下
CMakeLists.txt中添加
link_libraries(mysqlclient)
在代码中添加下面部分的代码:
#include “sqlite3.h”
int len;
sqlite3 *db=NULL;
len=sqlite3_open("ndslib.db",&db);
if(len)
{
printf("connect success!\n");
}
然后进行编译、执行,查看是否可正确链接数据库:
2、测试libXX.so库与 libmysqlclient.so的兼容性
安装musql 数据库相关库:
sudo apt-get install mysql-server
sudo apt isntall mysql-client
sudo apt install libmysqlclient-dev
将libmysqlclient.so库存放在/usr/lib/x86_64-linux-gnu目录下
CMakeLists.txt中添加
link_libraries(sqlite3)
在原来可正确执行的测试程序中添加下面代码:
#include"mysql/mysql.h"
MYSQL conn;
mysql_init(&conn);
if(!mysql_real_connect(&conn,"172.X.x.X","root","root","sdfapi_test",3306,0,0))
{
printf("Connect to DB fail!\n");
}
else
{
printf("Connect to DB success!\n");
}
然后进行编译,发现没有问题,但是执行的时候就会有错误,此部分应该是被测试的so库有变量冲突(或者其他原因,具体原因需要开发去定位问题)