VisualGDB系列7:使用VS创建Linux静态库和动态库
根据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静态库和动态库的更多相关文章
- 在Linux中创建静态库和动态库
我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...
- 在Linux中创建静态库和动态库 (转)
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
原文出处: 吴秦的博客 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学 ...
- linux中创建静态库和动态库
1. 函数库有两种:静态库和动态库. 静态库在程序编译的时候会被连接到目标代码中,程序运行时将不再需要改静态库. 动态库中程序编译的时候并不会连接到目标代码中,而是在程序运行时才被载入,因此在程序运行 ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
随机推荐
- activiti--6-------------------------------------连线(一般数据库表的查询顺序)
一.流程图 二.这次把流程图和Java类放在一个包下 三.代码 package com.xingshang.f_sequenceFlow; import java.io.InputStream; im ...
- 运行“cordova build android” - 无法找到属性android:fontVariationSettings和android:ttcIndex
:app:processArm64DebugResourcesC:\Users\xfcao\.gradle\caches\transforms-1\files-1.1\xwalk_core_libra ...
- python 删除文件中指定行
代码适用情况:xml文件,循环出现某几行,根据这几行中的某个字段删掉这几行这段代码的作用删除jenkins中config.xml中在自动生成pipline报错的时的回滚 start = '<se ...
- MAC下ssh免密码登录远程服务器
生成密钥.在终端下执行命令: ssh-keygen -t rsa 一路回车,各种提示按默认不要改,等待执行完毕.然后执行: ls ~/.ssh #可以看到两个密钥文件:id_rsa(私钥) id_rs ...
- TXLSReadWriteII2版本导出Excel文件:
//TXLSReadWriteII2版本导出Excel文件: procedure TForm1.N1Click(Sender: TObject); var i: Integer; aSaveDialo ...
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
前言: 以各种应用程序做自我寄宿的宿主原理方法大同小异,故:这儿直接上案例! 步骤一:创建服务契约和服务 1.新建解决方案:添加WCF服务库项目. 2.为了演示,我把自动生成的接口以及实现接口的类删 ...
- Python基础-列表推导式
python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...
- php-fpm进程内存泄漏
线上服务器内存报警 线上web8G内存的服务器,内存几乎吃光,top查看,发现php-fpm进程每个都是几十M,php-fpm配置static, 一共150个 解决 排除过程中,其他机器相同配置都没有 ...
- IO - 文件的读取与写入
最近有较多提取文档内容,然后拼接成sql之类的,但是纯粹的复制粘贴又太傻,就写了一个脚本,自动读取文件内容(word文档可能需要复制成txt文本),然后拼接sql,最后写入到指定文件中,试了下还是蛮好 ...
- windows下用vs2010编译ffmpeg
转载自;http://q1q2q3q4q5q6ln.blog.163.com/blog/static/500794332014666536283/ (注意:请务必先阅读:七,后记补充:) ffmpeg ...