ubuntu vscode c++生成so及調用調試so包

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-referencehttps://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++的開發,本文記錄簡單的環境配置,以便查詢,後續繼續補充內容,歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章