Develop C++ programs on Linux using Visual studio 2019

开发环境

  • Visual Studio 2019 Enterprise (BF8Y8-GN2QH-T84XB-QVY3B-RC4DF)
  • openssh-server (仅适用于远程 Linux 系统)- Visual Studio 通过安全 SSH 连接以连接到远程 Linux 系统。
  • gcc gcc-c++ - Visual Studio 2019 为 GCC 和 Clang 提供现成的支持。
  • gdb - Visual Studio 会在 Linux 系统上自动启动 gdb,并使用 Visual Studio 调试器的前端在 Linux 上提供完全保真度调试体验。
  • gdb-gdbserver
  • rsync zip unzip - 包含 rsync 和 zip 允许 Visual Studio 将头文件从 Linux 系统提取到 Windows 文件系统以供 IntelliSense 使用。
  • make
  • CMake(仅 CMake 项目)- 可以为 Linux 安装 Microsoft 的静态链接的 CMake 二进制文件。

创建项目

程序结构

在这里插入图片描述

项目类型

在这里插入图片描述
无论是动态库,静态库,主程序都选择此项目类型

动态库

  • d_lib.h
#ifndef D_LIB_H
#define D_LIB_H

int dynamic_test(int n);

#endif // D_LIB_H
  • d_lib.cpp
#include "d_lib.h"

int dynamic_test(int n)
{
    return n * 200;
}

静态库

  • s_lib.h
#ifndef S_LIB_H
#define S_LIB_H

int static_test(int n);

#endif // S_LIB_H

  • s_lib.cpp
#include "s_lib.h"

int static_test(int n)
{
    return n * 100;
}

主程序

  • main.cpp
#include <cstdio>
#include "s_lib/s_lib.h"
#include "d_lib/d_lib.h"

int main()
{
    printf("static_library test : %d\n", static_test(1));
    printf("dynamic_library test : %d\n", dynamic_test(1));

    return 0;
}

项目配置

动态库

"常规"配置

在这里插入图片描述

  • 本地输出目录
"$(ProjectDir)bin\$(Platform)\$(Configuration)\" 修改为 "$(ProjectDir)..\bin\$(Platform)\$(Configuration)\"
  • 目标文件扩展名
    “.out” 修改为 “.so”

  • 远程生成根目录

"~/projects" 修改为 "/home/user/projects/$(SolutionName)"
  • 配置类型
    “应用程序(.out)” 修改为 “动态库(.so)”

静态库

"常规"配置

在这里插入图片描述

  • 本地输出目录
"$(ProjectDir)bin\$(Platform)\$(Configuration)\" 修改为 "$(ProjectDir)..\bin\$(Platform)\$(Configuration)\"
  • 目标文件扩展名
    “.out” 修改为 “.a”

  • 远程生成根目录

"~/projects" 修改为 "/home/user/projects/$(SolutionName)"
  • 配置类型
    “应用程序(.out)” 修改为 “静态库(.a)”

主程序

"常规"配置

在这里插入图片描述

  • 本地输出目录
"$(ProjectDir)bin\$(Platform)\$(Configuration)\" 修改为 "$(ProjectDir)..\bin\$(Platform)\$(Configuration)\"

为了将所有项目输出文件放到同一个目录中,方便相互引用。

  • 目标文件扩展名
    “.out"修改为”",为了不生成文件后缀,一般的Linux可执行程序是没有扩展名称的,可修改也可不修改。

  • 远程生成根目录

"~/projects" 修改为 "/home/user/projects/$(SolutionName)"

" ~ " 和 " /root "是等价的,但是运行时动态库搜索目录不支持~路径,添加“$(SolutionName)”是为了区分不同的解决方案下相同名称的项目。

  • 远程生成项目目录
"~/projects" 修改为 "$(RemoteRootDir)/$(ProjectName)"

头文件路径

在这里插入图片描述
附加包含目录:在"$(StlIncludeDirectories);%(AdditionalIncludeDirectories)“前面添加”./…;",这个是远程Linux主机上的路径,相当于gcc编译时指定"-I[路径]“选项;一般是先把需要的头文件从Linux复制到windows,然后设置"配置属性”->“VC+ +目录”->“包含目录”,这样在编写Linux程序时,提示信息更加的友好。

库路径

在这里插入图片描述
附加库目录:在"%(AdditionalLibraryDirectories)“前面添加”$(RemoteRootDir)/bin/$(Platform)/$(Configuration);",这个是远程Linux主机上的路径,相当于gcc编译时指定"-L[路径]"选项,用于指定引用动态库和静态库的目录;

在这里插入图片描述
其他选项:添加"-Wl,-rpath=$(RemoteRootDir)/bin/$(Platform)/$(Configuration) ",指定程序运行时搜索动态库的路径。

依赖库

在这里插入图片描述
库依赖项:添加"d_lib;s_lib",相当于gcc设置"-l[库名称]“选项,用于指定链接时所需要的动态库和静态库名称,如果找不到依赖的库文件,链接时会错误,显示"无法解析的符号”。

调试

在这里插入图片描述
程序:"$(RemoteTargetPath)“修改为”$(RemoteRootDir)/bin/$(Platform)/$(Configuration)/$(TargetName)$(TargetExt)",因为前面修改了本地输出目录导致远程输出目录也相应发生变化,这里修改一致。

工作目录:"$(RemoteOutDir)“修改为”$(RemoteRootDir)/bin/$(Platform)/$(Configuration)",这个是远程主机Linux上的路径,如果设置不正确将找不到引用的动态库,调试程序无法启动。

其他调试程序命令:"“修改为"set solib-search-path $(SolutionDir)bin/$(Platform)/$(Configuration)”,这个是本地路径,调试符号是从本地加载的,否则调试动态库时,gdb会输出没有找到调试符号文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值