根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成。主要是作为个人学习记录。有错误的地方,Robin欢迎大家指正。

本文介绍如何在VS中创建静态库和动态库,并用VisualGDB来调试它们。

首先我们用VisualGDB创建一个简单的Linux应用程序,然后添加一个静态库和一个动态库,并在调试器中测试它们。

为了尝试本文中的步骤,你需要一台Windows机器和一台Linux机器:

  • 两个物理电脑;
  • 一个Windows电脑及运行在其上的Linux虚拟机(使用VIRTUALBOX/VMWARE);
  • 一个Linux电脑及运行在其上的Windows虚拟机(使用VIRTUALBOX/VMWARE)。

  在你的Windows电脑上安装好VisualGDB后,就可以开始下面的步骤了。

1 添加Linux主应用程序

根据《使用VS来开发Linux程序》,在VS中创建一个简单的Linxu app。该项目的名称为LinuxApp,构建这个app确保能够调试它。

2 创建静态库

2.1 开始创建项目

在VS的Solution Explorer中,在solution项上右键,选择”Add->New Project”:

2.2 启动项目创建向导

现在开始创建静态库。保证已经选择VisualGDB向导,并将该静态库项目的名称命名为MyStaticLib,然后点击”OK”:

2.3 选择项目类型为静态库

选择”Create a new project”->”Static library”->”Use MSBuild”,并点击”Next”:

2.4 选择Linux电脑

在下一页选择远程Linux机器。保证和之前的应用程序在同一个机器上。

2.5 源码访问设置

采用默认方式配置源码访问方式,然后点击”Finish”:

2.6 修改主应用程序的代码

现在已经创建了一个新的静态库项目。接下来修改主应用程序的main源文件如下:

#include <iostream>

#include "MyStaticLib/MyStaticLib.h"

using namespace std;

int main(int argc, char *argv[])

{

    char sz[] = "Hello, World!";    //Hover mouse over "sz" while debugging to see its contents

    cout << sz << MyStaticLibTest() << endl;    //<================= Put a breakpoint here

    return ;

}

2.7 从主程序项目中引用库项目

在编译之前,需要从主程序项目中添加一个引用到库项目:

2.8 在Add Reference窗口中勾选添加的库

在Add Reference窗口中,勾选MyStaticLib:

2.9 构建solution

构建solution:

2.10 断点调试静态库

在静态库的MyStaticLibTest()中加上断点。开始调试后会进入这个断点中。在call back窗口中,可以看到这个静态库函数被main()函数调用了:

3 添加动态库

3.1 添加动态库项目

在solution中添加一个新的动态库。该动态库的名称为MyDynamicLib,并在Project Type页面选择”Shared Library”。其他步骤和第2节中添加静态库的步骤一样。

3.2 从主程序项目中引用动态库

动态库项目创建成功后,从主应用程序中引用这个动态库:

3.3 修改主程序源码来调用动态库函数

修改主程序的main源文件,在该文件中调用动态库函数MyDynamicLibTest():

#include <iostream>

#include "MyStaticLib/MyStaticLib.h"

#include "MyDynamicLib/MyDynamicLib.h"

using namespace std;

int main(int argc, char *argv[])

{

    char sz[] = "Hello, World!"; //Hover mouse over "sz" while debugging to see its contents

    cout << sz << MyStaticLibTest() << MyDynamicLibTest() << endl; // Put a breakpoint here

    return ;

}

3.4 断点调试动态库

构建solution后。在MyDynamicLibTest()函数中放置断点并启动调试。进入该断点后,在VS的Module窗口中可以观察到加载的这个动态库,以及加载的其他动态库:

4 导出配置

配置基于VisualGDB的库后,可以“导出”一些build settings,然后这些settings就自动添加到所有引用该库的项目中。

比如,在MyDynamicLib Property页面下,”Exported Settings”->”Preprocessor Definitions”,键入:USING_MY_DYNAMIC_LIB

然后在主应用程序中检验这个新添加的宏,确保能够构建:

5 配置VisualGDB相关的settings

通过右键->VisualGDB Project Properties,可以为每个项目配置各种VisualGDB相关的settings:

如果你更喜欢这样的开发环境:多个库项目共享相同的通用settings(比如,deployment paths),你可以尝试创建基于CMake的项目(参考:使用VS创建CMake Linux项目)。VisualGDB透明地将CMake集成到VS中,当Solution Explorer中有变化时,会自动编辑CMakeLists.txt文件。

VisualGDB系列7:使用VS创建Linux静态库和动态库的更多相关文章

  1. 在Linux中创建静态库和动态库

    我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...

  2. 在Linux中创建静态库和动态库 (转)

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  3. 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用

    原文出处: 吴秦的博客    这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...

  4. linux中创建静态库和动态库

    1. 函数库有两种:静态库和动态库. 静态库在程序编译的时候会被连接到目标代码中,程序运行时将不再需要改静态库. 动态库中程序编译的时候并不会连接到目标代码中,而是在程序运行时才被载入,因此在程序运行 ...

  5. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  6. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  7. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  8. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  9. [转]Linux下用gcc/g++生成静态库和动态库(Z)

    Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10|  分类: linux |  标签:链接库  linux  g++  gcc  |举报|字号 订阅     ...

随机推荐

  1. Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)

    1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...

  2. IDEA报错: Invalid bound statement (not found): com.test.mapper.UserMapper.selectByPrimaryKey(转发:https://www.cnblogs.com/woshimrf/p/5138726.html)

    学习mybatis的过程中,测试mapper自动代理的时候一直出错,在eclipse中可以正常运行,而同样的代码在idea中却无法成功.虽然可以继续调试,但心里总是纠结原因.百度了好久,终于找到一个合 ...

  3. Docker容器部署tomcat出现中文乱码

    docker 容器部署tomcat后,日志文件中出现中文乱码,很多问号,中文的文件夹也是问好.先看看容器的locale: [root@docker1 ~]# docker exec -it 41de9 ...

  4. iOS 流媒体 基本使用 和方法注意

    项目里面需要添加视频方法   我自定义 选用的是 avplayer  没选择 MediaPlayer  原因很简单 , avplayer 会更容易扩展  有篇博客 也很好地说明了 使用avplayer ...

  5. html 文本输入框效果大汇集

    html 文本输入框效果大汇集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...

  6. 第二章 python中重要的数据结构(下)

    二.元组(tuple):不可变序列 跟list一样,也是一种序列,唯一不同的是,元组元素不能被修改,通常用(, ,)表示元组,也可以不加括号. #创建元组 >>> 1,2,3 (1, ...

  7. codeforces 54A

    题意:收到礼物的规则为每个假日必收到一份礼物,每K天里至少收到一份礼物,求出N天中收到的礼物的最小数量. 思路:将N天根据假日所在天数分为一段段,当假日与假日之间间隔天数hol[i]>-hol[ ...

  8. mongodb同步

    mongodb同步 py-mongo-sync MongodbSync mongodb 的一个同步工具,具备将一个数据源上的数据,同步到其它 mongodb 上,支持: mongos -> (m ...

  9. Nginx Rewrite语法详解

    重写中用到的指令 if  (条件) {}  设定条件,再进行重写 set #设置变量 return #返回状态码  return 403; break #跳出rewrite rewrite #重写 I ...

  10. App开发流程之iOS开发证书拾遗

    很久没有总结,回头看了一下过期的账号,记录的内容少之又少.最近有一些时间,想好好总结记录一下. 由于很久没有记录,想写的东西很多又很杂,想了一下,一篇一篇罗列知识点和经验,还不如写一个系列,记录一个应 ...