03_cmake_gdb


g++编译添加路径

image-20230109174457830

# step 1 在CMakeLists.txt中添加下列3行即可 或者 运行cmake .. -DCMAKE_BUILD_TYPE=Debug
SET(CMAKE_BUILD_TYPE "Debug")                                                                                                      
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")                                                                    
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")  

# step 2 编译成功得到可执行文件 比如yolov7
cmake .. && make && make install

# step 3 gdb调试编译好的可执行文件
gdb  yolov7

# step 4 gdb调试
输入layout 按ctrl+x 按 1
先打断点b 然后运行 run $1 (输入传参)

image-20230109174532533

CMakeLists.txt 模板

cmake_minimum_required(VERSION 3.5)

project(DeepSORT LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 找第三方依赖库
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
set(ONNXRUNTIME_DIR "/home/a/lib/onnxruntime-linux-x64-1.12.1")
include_directories("${ONNXRUNTIME_DIR}/include")
find_package(OpenCV 4 REQUIRED )

# 将项目所有相关的.h加入
include_directories(
    ${OpenCV_INCLUDE_DIRS}/include
    ${CMAKE_SOURCE_DIR}/tracker/deepsort/include
    ${CMAKE_SOURCE_DIR}/detector/YOLOv5/include
    )

# 将项目所有相关的。cpp加入
add_executable(DeepSORT
    detector/YOLOv5/src/YOLOv5Detector.cpp

    tracker/deepsort/src/FeatureTensor.cpp
    tracker/deepsort/src/model.cpp
    tracker/deepsort/src/kalmanfilter.cpp
    tracker/deepsort/src/linear_assignment.cpp
    tracker/deepsort/src/nn_matching.cpp
    tracker/deepsort/src/track.cpp
    tracker/deepsort/src/tracker.cpp
    tracker/deepsort/src/munkres.cpp
    tracker/deepsort/src/hungarianoper.cpp
    
    main.cpp)

# 链接库 .a 静态 .so 动态库 等其它LIBS(编译生成的依赖库)——第三方库
target_link_libraries(DeepSORT PRIVATE "${ONNXRUNTIME_DIR}/lib/libonnxruntime.so" ${OpenCV_LIBS} Eigen3::Eigen)

# --------------------------------------------------------------
if(OpenCV_FOUND)
    target_include_directories(${name} PRIVATE ${OpenCV_INCLUDE_DIRS})
    target_link_libraries(${name} PRIVATE ncnn ${OpenCV_LIBS})
elseif(NCNN_SIMPLEOCV)
    target_compile_definitions(${name} PUBLIC USE_NCNN_SIMPLEOCV)
    target_link_libraries(${name} PRIVATE ncnn)         
// 类型别名
using MATCH_DATA = std::pair<int, int>; 

cmake链接库

cmake 添加头文件目录,链接动态、静态库

image-20230109174620551

######################################################### 链接库开始 ###############################################################

# 1,绝对路径方式
#target_link_libraries(MyApp E:/cppTest/test1/lib/libutils.a)

# 2,相对路径,使用相对路径必须先告诉从哪里链接,在这里调用link_directories()是无效的,只有在生成target之前调用才会有效
# 在这里调用link_directories()是无效的,必须在生成可执行文件之前调用link_directories(),也就是在ADD_EXECUTABLE()之前调用
#link_directories(E:/cppTest/test1/lib)
#target_link_libraries(MyApp utils)
#target_link_libraries(MyApp libutils.a)
#message(STATUS "LINK_DIRECTORIES = ${LINK_DIRECTORIES}")

# 3,使用find_library()  
# find_library (<VAR> name1 [path1 path2 ...])
#find_library(LIB_UTILS utils E:/cppTest/test1/lib)
#message(STATUS "LIB_UTILS = ${LIB_UTILS}")
#target_link_libraries(MyApp ${LIB_UTILS})


# 4,使用find_path()和find_library()类似,find_path()可以用来找任何文件
# find_path (<VAR> name1 [path1 path2 ...])
#find_path(LIB_UTILS_PATH libutils.a E:/cppTest/test1/lib)
#message(STATUS "LIB_UTILS_PATH = ${LIB_UTILS_PATH}")
#target_link_libraries(MyApp ${LIB_UTILS_PATH}/libutils.a)

#5,使用find_package(),这种需要先有模块,要么是系统提供的,要么是自己写的,本例中是自己写的Findutils.cmake
#cmake提供的模块 D:\androidSDK\cmake\3.10.2.4988404\share\cmake-3.10\Modules下面
#将自己写的自己写的Findutils.cmake设置到CMAKE_MODULE_PATH中
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
find_package(utils)
if(utils_FOUND)
    # include_directories()作用是设置头文件的搜索路径
    # 官方的解释:Add the given directories to those the compiler uses to search for include files
    # utils_INCLUDE_DIR的值是在Findutils.cmake里面设置的
    include_directories(${utils_INCLUDE_DIR})
    
    #utils_LIBRARY的值是在Findutils.cmake里面设置的
    target_link_libraries(MyApp ${utils_LIBRARY})
endif(utils_FOUND)


######################################################### 链接库结束 ###############################################################

image-20230109174631270

cmake生成makefile之后,make edit_cache可以编辑编译选项。

cmake grammer

# 设置cmake版本,如果cmake版本过高,可能会出现错误
cmake_minimum_required(VERSION 3.5.1)
project(NCNN_test)

# 设置C++编译版本
set(CMAKE_CXX_STANDARD 11)

# 设置程序编译出的可执行文件
set(MAIN_FILE main.cpp)
set(EXECUTABLE_OUTPUT_PATH ../)

# 分别设置ncnn的链接库和头文件
set(NCNN_LIBS /ncnn/build/install/lib/libncnn.a)
set(NCNN_INCLUDE_DIRS /ncnn/build/install/include)

# 配置OpenMP
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

# 配置OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

include_directories(${NCNN_INCLUDE_DIRS})

# 建立链接依赖
add_executable(NCNN main.cpp)
target_link_libraries(NCNN ${NCNN_LIBS})
target_link_libraries(NCNN ${OpenCV_LIBS})

macro和function

https://www.cnblogs.com/Braveliu/p/15621973.html

image-20230109174718190

区别:

image-20230109174724933

function()
    <>
endfunction

message(STATUS "ARGV: ${ARGV}")
message(WARNING "NCNN_PIXEL not enabled, examples won't be built")

链接库

LINK_DIRECTORIES(“/home/jet/projects/ncnn_debug”) 链接库所在的目录路径

+

target_link_libraries(${name} PUBLIC ${SHM_LIBS}) 链接路径下库的名称

set(SHM_LIBS libutils.a)

macro(ncnn_add_example name)
    LINK_DIRECTORIES("/home/jet/projects/ncnn_debug")
    
    add_executable(${name} ${name}.cpp)
    if(OpenCV_FOUND)
        target_include_directories(${name} PRIVATE ${OpenCV_INCLUDE_DIRS})
        target_link_libraries(${name} PRIVATE ncnn ${OpenCV_LIBS})
    elseif(NCNN_SIMPLEOCV)
        target_compile_definitions(${name} PUBLIC USE_NCNN_SIMPLEOCV)
        target_link_libraries(${name} PRIVATE ncnn)
    endif()

    target_link_libraries(${name} PUBLIC ${SHM_LIBS})

    # add test to a virtual project group
    set_property(TARGET ${name} PROPERTY FOLDER "examples")
endmacro()

image-20230109174833546

image-20230109174836917

语法

https://juejin.cn/post/6844903558861553672

http://wuhongyi.cn/CodeProject/cmake/cmake.html

image-20230109174845827

image-20230109174848901

image-20230109174852308

cmake:option选项

image-20230109174858036

image-20230109174902859

image-20230109174905453

cmake 管理debug release

https://zhuanlan.zhihu.com/p/116953293

cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake .. -DCMAKE_BUILD_TYPE=Release

image-20230109174923317

cmake 配置模板

http://wuhongyi.cn/CodeProject/cmake/CmakeNote1.html

image-20230109174931557

应用1

https://www.cnblogs.com/ailumiyana/p/10721123.html

cmake_minimum_required(VERSION 3.5.1)
project(NANO_TRACKING)

set(CMAKE_CXX_STANDARD 11)

set(NCNN_LIBS /home/infer_framework_docker/ncnn/build/install/lib/libncnn.a) # 在哪编译路径就在哪,不能copy
set(NCNN_INCLUDE_DIRS /home/infer_framework_docker/ncnn/build/install/include/ncnn)

find_package(OpenCV REQUIRED)
if(OpenCV_FOUND)
    message(STATUS "OpenCV library: ${OpenCV_INSTALL_PATH}")
    message(STATUS "    version: ${OpenCV_VERSION}")
    message(STATUS "    libraries: ${OpenCV_LIBS}")
    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
endif()

find_package(Eigen3 3.3 REQUIRED)
if(Eigen3_FOUND)
    message(STATUS "Eigen3 library: ${Eigen3_INSTALL_PATH}")
    message(STATUS "    version: ${Eigen3_VERSION}")
    message(STATUS "    libraries: ${Eigen3_LIBS}")
    message(STATUS "    include path: ${Eigen3_INCLUDE_DIRS}")
endif()

find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()

include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${NCNN_INCLUDE_DIRS})
include_directories(include)

add_executable(NANO_TRACKING 
    src/BYTETracker.cpp
    src/kalmanFilter.cpp
    src/lapjv.cpp
    src/STrack.cpp
    src/utils.cpp
    src/nanodet.cpp
    )

target_link_libraries(NANO_TRACKING ${OpenCV_LIBS})
target_link_libraries(NANO_TRACKING ${NCNN_LIBS})

文章作者: Lee Jet
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lee Jet !
评论
  目录