cmake_minimum_required(VERSION 3.1) # 声明要求的 cmake 最低版本# 设置项目名称 和编程语言
project(yolov8 LANGUAGES CXX CUDA)set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86 89 90) # 通过 CMake 设置架构版本号
set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc) # 选择指定的cuda编译器# 设置 C++ 语言标准
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3")
set(CMAKE_CXX_STANDARD 14)# 设置工程编译类型
# set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_BUILD_TYPE Release)#定义CUDA_USE_STATIC_CUDA_RUNTIME,并将其值设为OFF
#为了解决cannot find -lopencv_dep_cudart问题
option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)# CUDA, REQUIRED 标志查找不到就报错
find_package(CUDA REQUIRED)
message(STATUS "CUDA Libs: \n${CUDA_LIBRARIES}\n")
get_filename_component(CUDA_LIB_DIR ${CUDA_LIBRARIES} DIRECTORY)
message(STATUS "CUDA Headers: \n${CUDA_INCLUDE_DIRS}\n")# OpenCV
find_package(OpenCV REQUIRED)
# message 向终端输出信息
message(STATUS "OpenCV Libs: \n${OpenCV_LIBS}\n")
message(STATUS "OpenCV Libraries: \n${OpenCV_LIBRARIES}\n")
message(STATUS "OpenCV Headers: \n${OpenCV_INCLUDE_DIRS}\n")# TensorRT
set(TensorRT_INCLUDE_DIRS /usr/include/x86_64-linux-gnu)
set(TensorRT_LIBRARIES /usr/lib/x86_64-linux-gnu)
message(STATUS "TensorRT Libs: \n${TensorRT_LIBRARIES}\n")
message(STATUS "TensorRT Headers: \n${TensorRT_INCLUDE_DIRS}\n")list(APPEND INCLUDE_DIRS${CUDA_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}${TensorRT_INCLUDE_DIRS}include)list(APPEND ALL_LIBS${CUDA_LIBRARIES}${CUDA_LIB_DIR}${OpenCV_LIBRARIES}${TensorRT_LIBRARIES})include_directories(${INCLUDE_DIRS})#生成程序
add_executable(${PROJECT_NAME}main.cppinclude/yolov8.hppinclude/common.hpp)# 将链接目录添加到target
target_link_directories(${PROJECT_NAME} PUBLIC ${ALL_LIBS})
# 将库文件链接到可执行程序上
target_link_libraries(${PROJECT_NAME} PRIVATE nvinfer nvinfer_plugin cudart ${OpenCV_LIBS})if (${OpenCV_VERSION} VERSION_GREATER_EQUAL 4.7.0)message(STATUS "Build with -DBATCHED_NMS")add_definitions(-DBATCHED_NMS)
endif ()
1、project(yolov8 LANGUAGES CXX CUDA)
新版本的cmake 中, 只需要在project的LANGUAGES 加入cuda,就可以添加对cuda的支持了
以前的写法:
project(demo)
enable_language(CUDA)#激活CUDA语言支持,使用第一个写法时要进行注释
#设置语言标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)
2、设置C++版本
CMAKE_CXX_STANDARD:设置C++标准;
CMAKE_CXX_FLAGS:设置C++编译参数;
CMAKE_C_FLAGS:设置C编译参数;
3、 设置工程编译类型
set(CMAKE_BUILD_TYPE Debug)
或者
set(CMAKE_BUILD_TYPE Release)
4、OpenCV 配置:find_package(OpenCV REQUIRED)
REQUIRED 标志查找不到就报错
#指定OpenCV版本
find_package(OpenCV 4.6 REQUIRED)
#如果不需要指定OpenCV版本
find_package(OpenCV REQUIRED)
上述命令在Ubuntu系统中找到OpenCVConfig.cmake, 该文件定义了OpenCV_INCLUDE_DIRS和OpenCV_LIBS 等变量,这些变量可以直接使用。
因而可以使用 include_directories和target_link_libraries来访问这两个变量。 可以通过打开terminal输入locate OpenCVConfig.cmake来找到这个.cmake文件,用以确认系统确实安装了OpenCV.
第二种使用link_libraries(opencv库名的方法)
find_package的作用是找到后缀名为.cmake的文件,以此来获取其中的引用目录(.h文件的路径)和库的路径,那么我们也可以选择直接使用正确路径的引用目录和库目录。
通过 include_directories( your/path/to/OpenCV/include) 来正确添加引用目录
通过 link_directories( your/path/to/OpenCV/lib) 来添加库的目录
通过 link_libraries(name1 name2 name3) 来实现库的链接
有了 link_libraries(name1 name2 name3),就不需要target_link_libraries(main ${PATH/NAME})了。
https://zhuanlan.zhihu.com/p/682200766
CUDA GPU编程指南:使用CMake配置开发环境 - 半个C++程序员