此篇接上篇 《VisualGDB:为Linux项目添加系统依赖库》,在本篇中我们重点分享一下如何基于VisualGDB
在VS中创建Linux动态库项目,如何编译及使用创建的动态库。
一、VisualGDB创建Linux动态库项目
如下,我们创建一个Linux下的动态库项目MyMath
二、编译动态库
我们稍微修改下生成的动态库模版项目,加点打印信息
#include "MyMath.h"
#include <stdio.h>
/*
To test the library, include "MyMath.h" from an application project
and call MyMathTest().
Do not forget to add the library to Project Dependencies in Visual Studio.
*/
static int s_Test = 0;
int MyMathTest()
{
printf("call MyMath:%d\n",++s_Test);
return s_Test;
}
构建和编译项目,我们看到打印了MyMath项目的Build日志信息
编译完成,我们到linux系统上指定目录下看看
Okk,果然生成了库。
三、动态库的使用
如你们所想,本章我们创建的动态库项目跟我们在上篇创建的Linux多线程项目在同一个解决方案中。我们要做的就是在如下的LinuxPorject2
项目中使用
1、在LinuxProject2
项目中配置动态库的头文件路径,库的路径以及库文件名称
或者
这里可以通过右侧的文件夹按钮选择要添加的路径即可,实测相对路径和绝对路径都ok。
记得在【Debug Settings】也设置一下
2、修改下代码,测试一下MyMath
动态库接口
#include <iostream>
#include <pthread.h>
#include "MyMath.h"
using namespace std;
void* threadFunc(void* args)
{
for (int i = 0; i < 10000; ++i)
{
MyMathTest();
std::cout << "do work :" << i << std::endl;
}
return NULL;
}
int main(int argc, char *argv[])
{
char sz[] = "Hello, World!"; //Hover mouse over "sz" while debugging to see its contents
cout << sz << endl; //<================= Put a breakpoint here
// Multi thread
pthread_t id;
void* thread_result;
pthread_create(&id, NULL,threadFunc, (void*)sz);
pthread_join(id, &thread_result);
return 0;
}
这里有一个点要提醒一下
包含头文件时,大小写必须要跟头文件名保持严格一致。在windows上,文件名是忽略大小写的,习惯中我们使用VS IDE智能联想补全,有时候就是默认小写;但是在Linux下文件区分大小写,你文件名不严格一致,你就会发现报错找不到这个头文件了,所以,一定注意。
不好,重新生成下解决方案,结果报错了,咋回事?
这里要注意,在linux下,我们库文件的命令方式是Libxxx.so
,这里我们需要手动干一件事儿,回到Linux下,MyMath
的库文件编译目录,手动拷贝一个符合格式规范的库的副本。如下:
再运行一下调试器
漂亮,MyMath
动态库调用成功,正常打印输出了我们预想的内容。