gdb、g++、vscode和cmake开发(学习手记)

gdb、g++、vscode和cmake开发(学习手记)_第1张图片

gdb、g++、vscode和cmake开发(学习手记)_第2张图片

Bin:全称binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。

Dev:该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似window下的分配盘符)。

Etc:该目录主要存储一些配置文件。

Home:表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。

Proc:全称process,表示进程,该目录中存储的是Linux运行时候的进程。

Root:该目录是root用户自己的家目录。

Sbin:全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。

Tmp:表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。

Usr:存放的是用户自己安装的软件。类似于windows下的program files。

Var:存放的程序/系统的日志文件的目录。

Mnt:当外接设备需要挂载的时候,就需要挂载到mnt目录下。

gdb、g++、vscode和cmake开发(学习手记)_第3张图片

gdb、g++、vscode和cmake开发(学习手记)_第4张图片

gdb

linux下gdb调试方法与技巧整理

Linux环境下的GDB调试方法

CMakeLists.txt

#cmake最小版本需求
cmake_minimum_required(VERSION xxx)

#设置此项目的名称
project(xxx) 

#生成可执行文件target ,后面填写的是生成此可执行文件所依赖的源文件列表。
add_executable(target target_source_codes) 

# 设置一个名字var_name 的变量,同时给此变量赋值为var_value
SET(var_name var_value)

# 指定编译器
# CMAKE_C_FLAGS_DEBUG          ----  C 编译器
# CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器
# -std=c++11  使用 C++11
# -g:只是编译器,在编译的时候,产生调试信息。
# -Wall:生成所有警告信息。一下是具体的选项,可以单独使用
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11   -g  -wall  ")

#指定编译类型,debug 或者为 release
# debug 会生成相关调试信息,可以使用 GDB 进行
# release 不会生成调试信息。当无法进行调试时查看此处是否设置为 debug.
set(CMAKE_BUILD_TYPE Debug)

# 打印消息
MESSAGE("MSG") 

#给变量var_name赋值为var_value,comment是此变量的注释,和SET 有类似的功效,用于给某变量设置默认值
option(var_name "comment" var_value) 

# 添加include路径,也就是头文件路径
include_directories(xxx) 

# 调用xxx子目录的CMakeLists.txt执行
add_subdirectory(xxx) 

# 给编译器添加xxx参数
add_compile_options(xxx)

# 给编译器添加库目录,
link_directories(xxx)

# 生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表
add_library(lib_name SHARED or STATIC lib_source_code) 

# 给目标添加依赖库
target_link_libraries(target_name lib_name ...)

最小CMake工程

cmake_minimum_required(VERSION 3.0)

project(WAR)

include_directories(${CMAKE_SOURCE_DIR}/include)

set(CMAKE_BUILD_TYPE Debug)

add_executable(target main.cpp src/Gun.cpp src/Soldier.cpp)

多目录工程 - 直接编译

# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 3.0)

#project name
project(SWAP)

#head file pat
include_directories( include )

#source directory files to var
add_subdirectory( src DIR_SRCS )

#add executable file  
add_executable(swap_02 ${TEST_MATH})

#add link library  
target_link_libraries(${FS_BUILD_BINARY_PREFIX}sqrt ${LIBRARIES}) 

多目录工程 - 生成库编译

# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 3.0)

#project name  
project(SWAP_LIBRARY)

#add compile options
add_compile_options("-Wall -std=c++11")

#set CMAKE_BUILD_TYPE
set( CMAKE_BUILD_TYPE Debug ) 

# set output binary path  
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

############################################################
# Create a library
############################################################

#Generate the static library from the library sources
add_library( swap_library STATIC src/Swap.cpp )

target_include_directories( swap_lib PUBLIC ${PROJECT_SOURCE_DIR}/include )

############################################################
# Create an executable
############################################################

# Add an executable with the above sources
add_executable( swap_01 main.cpp )

# link the new swap_01 target with the swap_lib target
target_link_libraries( swap_01 swap_liby )

launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(lldb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/target",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "preLaunchTask": "Build",
            "MIMode": "lldb",
        }
    ]
}

tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "options": {"cwd": "${workspaceFolder}/build"},
    "tasks": [
        {
            "type": "shell",
            "label": "cmake",
            "command":"cmake",
            "args":[".."]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command":"make",
            "args":[]
        },
        {
            "label": "Build",
            "dependsOrder":"sequence",
            "dependsOn":["cmake","make"]
        },
        {
            "label": "echo",
            "type": "shell",
            "command": "echo Hello"
        }
    ]
}

cmake中的link_directories, LINK_LIBRARIES, target_link_libraries的区别

当我们在写CMakeLists.txt文件时,常常会搞不明白link_directories, LINK_LIBRARIES, target_link_libraries这3者的区别,下面就其详细介绍:

  • INCLUDE_DIRECTORIES(添加头文件目录)

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用(这里特指c++。c和Java中用法类似)。

比如:

include_directories("/opt/MATLAB/R2012a/extern/include")
  • LINK_DIRECTORIES(添加需要链接的库文件目录)

语法:

link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

比如:

LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")

  • LINK_LIBRARIES (添加需要链接的库文件路径,注意这里是全路径)

List of direct link dependencies.

比如:

LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")

LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

也可以写成:

LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
  • TARGET_LINK_LIBRARIES (设置要链接的库文件的名称)

语法:TARGET_LINK_LIBRARIES(targetlibrary1 library2 ..)

比如(以下写法(包括备注中的)都可以):

TARGET_LINK_LIBRARIES(myProject hello),连接libhello.so库

TARGET_LINK_LIBRARIES(myProject libhello.a)

TARGET_LINK_LIBRARIES(myProject libhello.so)

再如:

TARGET_LINK_LIBRARIES(myProject #这些库名写法都可以。

TARGET_LINK_LIBRARIES(myProject TARGET_LINK_LIBRARIES(myProject -leng)

CMakeLists文件链接方式有如下2种:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

include_directories(``"/opt/MATLAB/R2012a/extern/include"``)    

LINK_DIRECTORIES(``"/opt/MATLAB/R2012a/bin/glnxa64"``)      

add_executable(myProject main.cpp)     

target_link_libraries(myProject eng mx)     

#equals to below 

#target_link_libraries(myProject -leng -lmx) `

#target_link_libraries(myProject libeng.so libmx.so)`

cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 

include_directories(``"/opt/MATLAB/R2012a/extern/include"``)  

#directly link to the libraries. 

LINK_LIBRARIES(``"/opt/MATLAB/R2012a/bin/glnxa64/libeng.so"``) 

LINK_LIBRARIES(``"/opt/MATLAB/R2012a/bin/glnxa64/libmx.so"``)

#equals to below 

#LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so") 

add_executable(myProject main.cpp)

你可能感兴趣的:(cmake,vscode,linux)