VisualStudio远程编译调试linux_c++程序(二)

前章讲述了gdb相关,这章主要讲述用VisualStudio调试编译linux_c++程序

1:环境

win10

VisualStudio 2022 Community

ubuntu22.04

2:安装

1>vs安装时,勾选 使用c++进行linux 和嵌入式开发 (这里以vs2022为例)

OR VS安装好了, 选择工具->获取工具和功能->c++进行linux 和嵌入式开发->修改

2>Linux 机子(虚拟机) 设置好固定IP(为了以后方便) DNS 114.114.114.114 阿里223.5.5.5

linux 准备好 gcc/g++ gdb gdbserver

查看是否安装了ssh

whereis ssh

ps -e|grep ssh #查看是否在运行

3>没有自行安装

ssh_config为客户端配置文件

sshd_config为服务器端配置文件 需要是这个

没有 安装 没有/etc/ssh/sshd_config 也直接安装

sudo apt-get update

sudo apt-get install openssh-server

4>SSH开启密码登录。

<1>vim /etc/ssh/sshd_config,修改以下信息。

PasswordAuthentication yes

<2>重启SSH服务

systemctl restart sshd 或 service sshd restart

可能遇到的问题

1:Failed to start sshd.service: Unit sshd.service not found.

解决方案:

添加ssh.service

systemctl enable ssh.service

2:ptrace: Operation not permitted.权限错误

com.jetbrains.cidr.execution.debugger.backend.gdb.GDBDriver$GDBCommandException: ptrace: Operation not permitted.

解决:

编辑/etc/sysctl.d/10-ptrace.conf这个文件,若没有,创建之。设置(默认是1)

kernel.yama.ptrace_scope = 0

这样下次启动时会生效。

3:vs远程配置

工具->选项->跨平台->连接管理器

增加 ssh连接

主机名 写IP

端口 默认 22 ssh的

用户名 登录账号

密码 密码

4:demo演示

这里以Jsoncpp为例 download:https://github.com/open-source-parsers

如果没有cmake 就安装 sudo apt-get install cmake 这里安装的 3.22版本

sudo snap install cmake # version 3.30.5, or

sudo apt install cmake # version 3.22.1-1ubuntu1.22.04.2

See 'snap info cmake' for additional versions.

bash 复制代码
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=OFF -DBUILD_SHARED_LIBS=ON -DARCHIVE_INSTALL_DIR=. -DCMAKE_INSTALL_INCLUDEDIR=include -G "Unix Makefiles" ../..


只执行了make 没有执行 make install

code 官方代码 用来测试用

cpp 复制代码
#include "json/json.h"
#include <fstream>
#include <iostream>
#include <stdio.h>
/** \brief Parse from stream, collect comments and capture error info.
 * Example Usage:
 * $g++ readFromStream.cpp -ljsoncpp -std=c++11 -o readFromStream
 * $./readFromStream
 * // comment head
 * {
 *    // comment before
 *    "key" : "value"
 * }    
 * // comment after
 * // comment tail
 */
int main(int argc, char* argv[]) {
    Json::Value root;
    std::ifstream ifs;
    ifs.open(argv[1]);

    Json::CharReaderBuilder builder;
    builder["collectComments"] = true;
    JSONCPP_STRING errs;
    if (!parseFromStream(builder, ifs, &root, &errs)) {
        std::cout << errs << std::endl;
        return EXIT_FAILURE;
    }
    std::cout << root << std::endl;
    return EXIT_SUCCESS;
}


1>同步 usr/include /usr/local 目录

在 VC++ 目录 包含目录 /usr/include

工具->选项->跨平台->连接管理器->远程标头IntelliSense管理器->(选中相应IP)浏览OR 更新

这样就同步了 这个解决了头文件问题
:
不认识 必须要写 /home/ubuntu/ 不然更新不下来

包含目录 /usr/include;/home/ubuntu/code/c/jsoncpp-master/include   

包含库目录 /usr/lib/x86_64-linux-gnu;/usr/lib;/home/ubuntu/code/c/jsoncpp-master/build/debug/lib

静态库

在连接器 附加依赖项 /home/ubuntu18/code/c_code/jsoncpp-master/build/lib/libjsoncpp.a

1> 在 VC++ 目录-> 库目录 /usr/lib/x86_64-linux-gnu;/usr/lib 这两个不知道哪个才有用可以都包含了

2> 链接器->库依赖项 ssl;crypto

编译结果如下

远程调试

没有执行make install,所以需要手动增加下 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/code/c/jsoncpp-master/build/debug/lib

调试 代码修改下

cpp 复制代码
#include "json/json.h"
#include <fstream>
#include <iostream>
#include <stdio.h>
int main(int argc, char* argv[]) {
    Json::Value root;
    std::ifstream ifs;
    ifs.open(argv[1]);

    Json::CharReaderBuilder builder;
    builder["collectComments"] = true;
    JSONCPP_STRING errs;
    if (!parseFromStream(builder, ifs, &root, &errs)) {
        std::cout << errs << std::endl;
        return EXIT_FAILURE;
    }
    std::cout << root << std::endl;
    std::cout <<"name"<< root["name"] << std::endl;
    return EXIT_SUCCESS;
}

额外话题:环境变量

环境变量设置 参考 https://blog.csdn.net/hfhhgfv/article/details/83926923

/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.profile:在登录时用到的第三个文件。profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件

~/.bashrc 或者 ~/.bash_profile 中加入 export 语句,前者在每次登陆和每次打开 shell 都读取一次,后者只在登陆时读取一次

对所有用户有效修改/etc/profile

对个人有效则修改~/.bashrc

bash 复制代码
PTAH  export PATH =$PATH:$HOME/bin  
GCC 查找头文件的路径   C_INCLUDE_PATH=$C_INCLUDE_PATH:/MyInclude   export C_INCLUDE_PATH 
G++ 查找头文件的路径   CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/MyInclude  export CPLUS_INCLUDE_PATH  
查找动态链接库的路径: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib   export LD_LIBRARY_PATH  
查找静态库的路径: LIBRARY_PATH=$LIBRARY_PATH:/MyStaticLib  export LIBRARY_PATH 

gcc/G++命令中手动设置搜索路径

bash 复制代码
添加头文件搜索路径  gcc test.c -I /home/my/include -o test   大写I  到目录这层
添加动态库搜索路径 gcc test.c -L /home/my/lib -lmylib -o test   大写L  到目录这层
添加静态库搜索路径 gcc test.c -L /home/my/lib -static -ltest -o test   大写L  到目录这层

5:如果觉得有用,麻烦点个赞,加个收藏

相关推荐
广州视觉芯软件有限公司5 分钟前
MFC,DLL界面库设计注意
c++·人工智能·计算机视觉·mfc
e调布鲁斯16 分钟前
恢复Ubuntu+Windows10双系统安装前状态及分区还原详细步骤
linux·运维·ubuntu
doll ~CJ23 分钟前
SQLite的BLOB数据类型与C++二进制存储学习记录
c++·sqlite·blob·图像数据存取·bitset标准库
demodashi6661 小时前
ARM64的Mac Node.js前置工作,nvm在线安装
linux·运维·macos
这题怎么做?!?1 小时前
【Linux】网络编程:实现一个简易的基于HTTP协议格式、TCP传输的服务器,处理HTTP请求并返回HTTP响应;GET方法再理解
linux·服务器·c语言·网络·c++·tcp/ip·http
vvw&2 小时前
使用Ubuntu快速部署MinIO对象存储
linux·运维·服务器·ubuntu·minio·cos·oss
归仁7 小时前
wvp 推拉转级联时频繁出现流无法观看的解决办法
linux·服务器·python·音视频
Trouvaille ~7 小时前
【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
开发语言·数据结构·c++·算法·迭代器模式·stl·map
万叶学编程7 小时前
Linux之初体验
linux
小小不董8 小时前
Oracle OCP认证考试考点详解082系列08
linux·运维·服务器·数据库·oracle·dba