1 ubuntu vscode c++配置

建议参考https://blog.csdn.net/weixin_43374723/article/details/84064644,介绍的很详细。

参考vscode官方介绍https://code.visualstudio.com/docs/cpp/config-linux,补充说明下task.json和launch.json的区别:

  • task.json表示编译时的配置项,生成默认task.json的操作是在某个cpp页面上使用快捷键ctrl+shift+p,打开"任务:运行任务",选择"c/c++:g++ build active file"可以生成生成默认task.json,其主要内容包括:

    {"version": "2.0.0","tasks": [{"type": "shell","label": "g++ build active file","command": "/usr/bin/g++","args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],"options": {"cwd": "/usr/bin"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true}}]
    }
    

    label指定了任务的别名,在launch.json中还需要使用;
    command指定了使用g++进行编译;
    args指定了编译时的参数,各参数的含义可以参考https://code.visualstudio.com/docs/editor/variables-reference和https://www.runoob.com/w3cnote/gcc-parameter-detail.html;

  • launch.json指定了调试设置,生成默认launch.json可以通过“Run > Add Configuration>选择C++ (GDB/LLDB)”。默认内容为:
    {"version": "0.2.0","configurations": [{"name": "g++ build and debug active file","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "g++ build active file","miDebuggerPath": "/usr/bin/gdb"}]
    }
    

    preLaunchTask指出了在调试之前预先执行的任务,注意这里和task.json中的label是一样的,表示在调试之前首先进行编译;
    program指定了要调试哪个程序;
    stopAtEntry设置为true表示在进入main函数时自动进入断点。

2 同一个文件夹下生成so包并且使用so包

代码结构:


vscode使用文件夹来管理工程,配置项存储在.vscode文件下。工程开发时,往往涉及到一个工程中生成so包,另一个工程下调用so包,并单步调试代码,个人习惯把这两个工程放到同一个文件夹下进行管理,所以这里设置gen文件夹下生成so包,use/main.cpp调用so包,通过配置文件来实现不同的任务。

2.1 生成so包时的配置文件

task.json:

{"version": "2.0.0","tasks": [{"type": "shell","label": "build","command": "/usr/bin/g++","args": ["-g",                               //要设置该选项,否则无法单步调试so包中的代码"${workspaceFolder}/gen/hello.cpp",   //so包函数实现的文件"-o","${workspaceFolder}/lib/libhello.so", //生成的包一定要是lib+包名+.so的形式"-fPIC",                              //生成和位置无关的so文件"-shared"                            //生成动态链接库,即so文件],"options": {"cwd": "/usr/bin"},"problemMatcher": ["$gcc"]}]
}

fPIC的含义,请参考:https://www.cnblogs.com/fengliu-/p/10216878.html
shared的含义,请参考:https://www.cnblogs.com/ziyunlong/p/6023121.html,就是创建动态链接库,对应于windows下的dll,所以在运行程序的时候的时候要通过系统的环境变量能找到对应的so文件。
launch.json:

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "g++ - 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${workspaceFolder}/lib/libhello.so",//"${fileDirname}/${fileBasenameNoExtension}","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build","miDebuggerPath": "/usr/bin/gdb"}]
}

2.2 调用so包时的配置文件

tasks.json

{"version": "2.0.0","tasks": [{"type": "shell","label": "build","command": "/usr/bin/g++","args": ["-g","${workspaceFolder}/use/main.cpp", //主函数"-o","${workspaceFolder}/lib/main",    //生成的可执行文件路径及名称"-I${workspaceFolder}/gen",        //头文件路径,多个路径时逗号分割    "-L${workspaceFolder}/lib",       //库文件路径,多个路径时逗号分割"-lhello"                       //具体的库文件,这里是指libhello.so],"options": {"cwd": "/usr/bin"},"problemMatcher": ["$gcc"]}]
}

如果main中需要使用opencv,可以在args中列出:

                 "-I", "/usr/local/include","-I", "/usr/local/include/opencv","-I", "/usr/local/include/opencv2","-L", "/usr/local/lib","-l", "opencv_core","-l", "opencv_imgproc","-l", "opencv_imgcodecs","-l", "opencv_video","-l", "opencv_ml","-l", "opencv_highgui","-l", "opencv_objdetect","-l", "opencv_flann","-l", "opencv_imgcodecs","-l", "opencv_photo","-l", "opencv_videoio"

“-l”, “opencv_videoio"和”-lopencv_videoio"是等价的,都是去找/usr/local/lib/libopencv_videoio.so文件。

launch.json:

{"version": "0.2.0","configurations": [{"name": "g++ - 生成和调试活动文件","type": "cppdbg","request": "launch","program": "${workspaceFolder}/lib/main",//设置调试的程序名称"args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build","miDebuggerPath": "/usr/bin/gdb"}]
}

调用so包时需要能够让可执行程序能够找到这个so包,需要设置~/.bashrc中的LD_LIBRARY_PATH中包含要引用的so包的路径,然后执行source ~/.bashrc,也可以参考https://blog.csdn.net/arackethis/article/details/43342655获取更多配置方法。关于Linux共享库的搜索路径先后顺序可以参考https://blog.csdn.net/rryqszq4/article/details/51142468,这里摘抄下:
Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib

shell中执行:ldd main可以看看main依赖哪些路径下的哪些动态链接库;nm -D libhello.so可以查看so包中导出的所有函数。

初次在linux下进行c++的开发,本文记录简单的环境配置,以便查询,后续继续补充内容,欢迎批评指正。

ubuntu vscode c++生成so及调用调试so包相关推荐

  1. ubuntu 16.04使用IntelRealSense D435i调用realsense ROS包时,报symbol lookup error和undefined symbol错误的解决办法

    在ubuntu 16.04使用IntelRealSense D435i调用realsense ROS包时,运行 roscore roslaunch realsense2_camera rs_rgbd. ...

  2. ubuntu vscode通过cmake配置c++和VS2019一样 进行调试

    之前的 linux下vscode配置c++,使其和Visual Studio2019一样调试文章和本篇类似,配置vscode使其和vs2019进行调试和编译,但是之前的文章不是很实用,是通过命令行的形 ...

  3. 分享一些 VsCode 各场景相关的高级调试与使用技巧

    VsCode自从诞生以来,以其各自优异的特性迅速走红.尤其是对于前端开发小伙伴来说,几乎成为必不可少的开发工具.所以,熟练掌握VsCode的各自使用技巧与调试技巧会让你的日常开发工作效率倍增. 本文将 ...

  4. 使用wsdl2java命令生成webservice本地调用代码

    使用wsdl2java命令生成webservice本地调用代码 如果没有设置环境变量,就要先进入cxf的bin目录 例子: wsdl2java -d . http://localhost:7890/h ...

  5. 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明 分类: 小技巧 Win32编程 C++ 解决难题 .NET2009-02-05 20:53 5186人 ...

  6. vs code linux opencv,ubuntu+vscode 测试运行opencv

    ubuntu+vscode 测试运行opencv ubuntu+vscode 测试运行opencv 之前再ubuntu配置好了opencv,今天测试运行一下. 1.创建一个文件夹opencv+test ...

  7. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  8. GCC 生成的符号表调试信息剖析

    GCC把C语言源文件('.c')编译成汇编语言文件('.s'),汇编器把汇编语言文件翻译成目标文件('.o'),最后由链接器链接所有的目标文件和有关的库生成可执行文件('a.out'). 如打开'-g ...

  9. VsCode使用笔记【1】Ubuntu+vscode+Monokai+修改主题中的字体颜色

    VsCode使用笔记[1]Ubuntu+vscode+Monokai+修改主题中的字体颜色 ## 标题一.找到 标题主题位置 ubuntu中vscode默认安路径: 计算机-->usr--> ...

  10. VB .bas文件生成dll并且调用

    一.生成dll. 有时候我们会将一些核心算法之类的东西放在单独一模块中(.bas文件),这些算法我们不想让别人知道,所以我们可以把它封装成DLL文件,增强代码的安全性,然后再调用这些已经写好的接口. ...

最新文章

  1. 别再用 kill -9 了,这才是微服务上下线的正确姿势!
  2. 回头验卦,占IT公司例中淘宝案例之总结
  3. C# Byte数组与Int16数组之间的转换
  4. Visual Studio 2017正式版离线安装及介绍
  5. 会话跟踪之Session
  6. leetcode743. 网络延迟时间(迪杰斯特拉算法)
  7. ADODB.Stream 错误 '800a0bbc' 写入文件失败
  8. Linux操作系统基础解析之(三)——基本命令行操作及获得帮助的方法
  9. 架构设计工作笔记001---智慧城市项目架构设计中应该注意的问题
  10. java cmd退出_在Java中关闭命令行窗口
  11. 个人简历html模板
  12. 炼石:栉风沐雨七载路,不负韶华再出发
  13. Markdown编辑器如何配置图片大小
  14. hihocoder 1251 Today Is a Rainy Day 2015北京区域赛C
  15. 第1章 java EE应用
  16. 特征多项式法(characteristic polynomial )求特征值(结合lanczos和householder)(python,数值积分)
  17. XJOI 1003 质因数分解
  18. 应届毕业生面试软件测试...测试小白如何抓住机会
  19. 程序员如何管理自己的代码
  20. 关于养老保险你不得不了解的事儿

热门文章

  1. 小米4android8.0root,小米8青春版获取root权限的教程
  2. LeetCode 237. 删除链表中的节点
  3. python|数据分析
  4. 网络广告中各种广告形式
  5. 【历史上的今天】1 月 23 日:现代集成电路雏形;JDK 1.0 发布;数学大师诞生
  6. Qt Visual Studio生成moc文件
  7. Kmplayer音频设置
  8. 电信计费系列2-手机+座机计费
  9. 数据分析之MySQL(十二)账户管理
  10. 十七节 samba nfs共享