在登临中.cu文件,使用dlcc编译,cpp文件使用g++编译,两者应区分放置,使用不同的编译器进行编译,最后再链接在一起,其目录结构如下:
目录结构
├─yolox_proj_bak
| CMakeLists.txt
|
±–build
| | CMakeCache.txt
| | cmake_install.cmake
| | Makefile
| | yolox_proj
| |
| —CMakeFiles
| | cmake.check_cache
| | CMakeDirectoryInformation.cmake
| | CMakeOutput.log
| | Makefile.cmake
| | Makefile2
| | progress.marks
| | TargetDirectories.txt
| |
| ±–3.18.4
| | | CMakeCCompiler.cmake
| | | CMakeCXXCompiler.cmake
| | | CMakeDetermineCompilerABI_C.bin
| | | CMakeDetermineCompilerABI_CXX.bin
| | | CMakeSystem.cmake
| | |
| | ±–CompilerIdC
| | | | a.out
| | | | CMakeCCompilerId.c
| | | |
| | | —tmp
| | —CompilerIdCXX
| | | a.out
| | | CMakeCXXCompilerId.cpp
| | |
| | —tmp
| ±–CMakeTmp
| —yolox_proj.dir
| | build.make
| | cmake_clean.cmake
| | CXX.includecache
| | depend.internal
| | depend.make
| | DependInfo.cmake
| | flags.make
| | link.txt
| | progress.make
| |
| —src
| | dlnne_algo_unit_yolov5.cpp.o
| | image_helper.cc.o
| | main.cpp.o
| |
| —additionalUtils
| cudahelper.cc.o
|
±–bw_cuda_kernel
| | build.sh
| | CMakeLists.txt
| |
| ±–build
| | | BwCudaKernel.pc
| | | BwCudaKernelConfig.cmake
| | | BwCudaKernelConfigTargets.cmake
| | | BwCudaKernelConfigVersion.cmake
| | | CMakeCache.txt
| | | cmake_install.cmake
| | | CPackConfig.cmake
| | | CPackSourceConfig.cmake
| | | install_manifest.txt
| | | libbw_cuda_kernel.so
| | | libbw_cuda_kernel.so.1.0
| | | libbw_cuda_kernel.so.1.0.0
| | | Makefile
| | |
| | —CMakeFiles
| | | cmake.check_cache
| | | CMakeDirectoryInformation.cmake
| | | CMakeOutput.log
| | | Makefile.cmake
| | | Makefile2
| | | progress.marks
| | | TargetDirectories.txt
| | |
| | ±–3.18.4
| | | | CMakeCCompiler.cmake
| | | | CMakeCXXCompiler.cmake
| | | | CMakeDetermineCompilerABI_C.bin
| | | | CMakeDetermineCompilerABI_CXX.bin
| | | | CMakeSystem.cmake
| | | |
| | | ±–CompilerIdC
| | | | | a.out
| | | | | CMakeCCompilerId.c
| | | | |
| | | | —tmp
| | | —CompilerIdCXX
| | | | a.out
| | | | CMakeCXXCompilerId.cpp
| | | |
| | | —tmp
| | ±–bw_cuda_kernel.dir
| | | | build.make
| | | | cmake_clean.cmake
| | | | CXX.includecache
| | | | depend.internal
| | | | depend.make
| | | | DependInfo.cmake
| | | | flags.make
| | | | link.txt
| | | | progress.make
| | | |
| | | —src
| | | dimwork.cu.cc.o
| | |
| | ±–CMakeTmp
| | —Export
| | —lib
| | —cmake
| | —BwCudaKernel
| | BwCudaKernelConfigTargets-noconfig.cmake
| | BwCudaKernelConfigTargets.cmake
| |
| ±–cmake
| | BwCudaKernel.pc.in
| | BwCudaKernelConfig.cmake.in
| | BwCudaKernelConfigVersion.cmake
| | BwCudaKernelCPack.cmake
| | ide.cmake
| | utils.cmake
| |
| ±–include
| | —bw_cuda_kernel
| | bw_cuda_kernel.h
| | version.h
| |
| —src
| dimwork.cu.cc
| dimwork.h
|
±–cmake
| install_dependencies.cmake
|
±–install
| ±–include
| | —bw_cuda_kernel
| | bw_cuda_kernel.h
| | version.h
| |
| —lib
| | libbw_cuda_kernel.so
| | libbw_cuda_kernel.so.1.0
| | libbw_cuda_kernel.so.1.0.0
| |
| ±–cmake
| | —BwCudaKernel
| | BwCudaKernelConfig.cmake
| | BwCudaKernelConfigTargets-noconfig.cmake
| | BwCudaKernelConfigTargets.cmake
| | BwCudaKernelConfigVersion.cmake
| |
| —pkgconfig
| BwCudaKernel.pc
|
±–src
| | dlnne_algo_unit_yolov5.cpp
| | dlnne_algo_unit_yolov5.h
| | image_helper.cc
| | image_helper.h
| | main.cpp
| |
| —additionalUtils
| cudahelper.cc
| cudahelper.h
|
—workspace
外部的主cmakelist
cmake_minimum_required(VERSION 3.5)
project(yolox_proj)
set(SDK_DIR $ENV{DLICC_PATH}/../)
#登临动态库编译后的安装目录:
set(DLHELPER_ROOT_DIR /dl/sdk/toolkit/DlDeepToolkit/c++/install)
#头文件目录:
set(DLHELPER_INCLUDE_DIR ${DLHELPER_ROOT_DIR}/include)
#动态库目录:
set(DLHELPER_LIB_DIR ${DLHELPER_ROOT_DIR}/lib)
#登临相关的动态库设置:
set(DLHELPER_LIB dldevice dlvidhelper dlnnehelper deepsort dlpreprocess)
#自定义cu安装子目录:
set(BW_SUB_LIB_ROOT_DIR ${CMAKE_SOURCE_DIR}/install)
#自定义编译的动态库:最终的动态库被链接到动态库bw_cuda_kernel
set(BW_SUB_LIBS bw_cuda_kernel)
#下面定义的是头文件查找的目录:
#登临基本sdk目录
include_directories(${SDK_DIR}/include)
include_directories(${SDK_DIR}/include/dlnne)
#登临的高层toolkit目录
include_directories(${DLHELPER_INCLUDE_DIR})
include_directories(${BW_SUB_LIB_ROOT_DIR}/include)
SET(OpenCV_DIR /dl/sdk/toolkit/DlDeepToolkit/c++/3rdparty/opencv-3.4.1/build/)
FIND_PACKAGE(OpenCV REQUIRED)
#包含源文件
file(GLOB_RECURSE cpp_srcs ${CMAKE_SOURCE_DIR}/src/*.cpp ${CMAKE_SOURCE_DIR}/src/*.cc ${CMAKE_SOURCE_DIR}/src/*.h)
message(STATUS ${cpp_srcs})
message(STATUS ${BW_SUB_LIB_ROOT_DIR})
#链接库的目录:
link_directories(
${SDK_DIR}/lib
${DLHELPER_LIB_DIR}
${BW_SUB_LIB_ROOT_DIR}/lib
)
#在include时,执行了子install_dependencies.cmake中的命令:
include(cmake/install_dependencies.cmake)
#添加最终的可执行文件:
add_executable(${PROJECT_NAME} ${cpp_srcs})
#链接最终的库
target_link_libraries(${PROJECT_NAME} PRIVATE curt ${DLHELPER_LIB} ${BW_SUB_LIBS} ${OpenCV_LIBS})
install_dependencies文件
用于编译.cu文件
#设置安装目录:
set(BW_INSTALL_DIR ${CMAKE_CURRENT_LIST_DIR}/../install)
#在路径下导入了包环境变量:
find_package(BwCudaKernel PATHS ${BW_INSTALL_DIR} NO_DEFAULT_PATH)
if (BwCudaKernel_FOUND)
message(STATUS "BW_CUDA_KERNEL FOUND")
message(STATUS "BW_CUDA_KERNEL DIR: ${BwCudaKernel_DIR}")
message(STATUS "BW_CUDA_KERNEL VERSION: ${BwCudaKernel_VERSION}")
else ()
#如果找不到则手动执行命令:
message(STATUS "BW_CUDA_KERNEL NOT FOUND, WILL BUILD")
execute_process(COMMAND bash build.sh WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../bw_cuda_kernel)
find_package(BwCudaKernel PATHS ${BW_INSTALL_DIR} NO_DEFAULT_PATH REQUIRED)
endif ()
#build.sh执行内部库的编译的脚本,完成自定义cuda动态库的编译工作。
#!/usr/bin/env bash
set -e
SCRIPT_PATH=$(readlink -f "$0")
BW_CUDA_KERNEL_SOURCE_DIR=$(dirname "$SCRIPT_PATH")
BW_INSTALL_PATH="${BW_CUDA_KERNEL_SOURCE_DIR}/../install"
BW_CUDA_KERNEL_BUILD_DIR="${BW_CUDA_KERNEL_SOURCE_DIR}/build"
rm -rf "${BW_CUDA_KERNEL_BUILD_DIR}" && mkdir -p "${BW_CUDA_KERNEL_BUILD_DIR}" && cd "${BW_CUDA_KERNEL_BUILD_DIR}"
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX="${BW_INSTALL_PATH}" "${BW_CUDA_KERNEL_SOURCE_DIR}"
make -j $(($(nproc) + 1)) && make install
注释:
set -e:这个命令会使 shell 在执行任何一个命令失败(返回非零的退出状态码)时,停止执行后续的命令。
SCRIPT_PATH=$(readlink -f "$0"):这个命令会将脚本文件所在的绝对路径赋值给变量 SCRIPT_PATH。其中,$0 表示当前脚本文件的名称,而 readlink -f 命令会将相对路径转换为绝对路径。
BW_CUDA_KERNEL_SOURCE_DIR=$(dirname "$SCRIPT_PATH"):这个命令会将 SCRIPT_PATH 所在的目录路径赋值给变量 BW_CUDA_KERNEL_SOURCE_DIR。其中,dirname 命令会返回给定路径的目录部分。
BW_INSTALL_PATH="${BW_CUDA_KERNEL_SOURCE_DIR}/../install":这个命令会将 BW_CUDA_KERNEL_SOURCE_DIR 的上级目录中的 install 目录路径赋值给变量 BW_INSTALL_PATH。
BW_CUDA_KERNEL_BUILD_DIR="${BW_CUDA_KERNEL_SOURCE_DIR}/build":这个命令会将 BW_CUDA_KERNEL_SOURCE_DIR 目录下的 build 目录路径赋值给变量 BW_CUDA_KERNEL_BUILD_DIR。
rm -rf "${BW_CUDA_KERNEL_BUILD_DIR}" && mkdir -p "${BW_CUDA_KERNEL_BUILD_DIR}" && cd "${BW_CUDA_KERNEL_BUILD_DIR}":这个命令会首先删除 BW_CUDA_KERNEL_BUILD_DIR 目录及其子目录(rm -rf "${BW_CUDA_KERNEL_BUILD_DIR}"),然后创建 BW_CUDA_KERNEL_BUILD_DIR 目录(mkdir -p "${BW_CUDA_KERNEL_BUILD_DIR}"),最后进入 BW_CUDA_KERNEL_BUILD_DIR 目录(cd "${BW_CUDA_KERNEL_BUILD_DIR}")。
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX="${BW_INSTALL_PATH}" "${BW_CUDA_KERNEL_SOURCE_DIR}":这个命令会使用 CMake 工具,在 BW_CUDA_KERNEL_SOURCE_DIR 目录下生成 Makefile,并指定生成动态链接库(-DBUILD_SHARED_LIBS=ON)和安装路径(-DCMAKE_INSTALL_PREFIX="${BW_INSTALL_PATH}")。
make -j $(($(nproc) + 1)) && make install:这个命令会使用 Make 工具编译并安装动态链接库。其中,-j 参数指定使用多少个线程进行编译,$(nproc) 表示获取当前系统的 CPU 核心数,make install 表示安装编译好的动态链接库。如果编译和安装成功,该命令会返回 0,否则会返回非零的退出状态码。
子cmakelist
cmake_minimum_required(VERSION 3.2.0)
project(bw_cuda_kernel)
set(Target bw_cuda_kernel)
set(CMAKE_CXX_COMPILER "dlcc")
#如果CMAKE_INSTALL_PREFIX未被用户指定,则将CMAKE_INSTALL_PREFIX设置为源代码目录的上一级目录下的install目录,并将路径保存到CMAKE_INSTALL_PREFIX缓存中。这里使用了FORCE选项,表示强制覆盖之前的CMAKE_INSTALL_PREFIX缓存值。如果CMAKE_INSTALL_PREFIX已经被用户指定,则不进行任何操作。
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/../install CACHE PATH ${CMAKE_SOURCE_DIR}/../install FORCE)
endif()
include_directories(${CMAKE_SOURCE_DIR}/include)
# 指定h文件
file(GLOB header_files ${CMAKE_SOURCE_DIR}/include/*.h)
# 指定cu文件
file(GLOB_RECURSE cc_files ${CMAKE_SOURCE_DIR}/src/*.cc ${CMAKE_SOURCE_DIR}/src/*.cu)
message(STATUS ${cc_files})
# 根据需要设置相应的编译选项
set(CXX_FLAGS -std=c++11 -fPIC -fpermissive --cuda-gpu-arch=dlgpuc64 -x cuda)
#创建所需的动态库:
add_library(${Target} SHARED ${cc_files})
set_target_properties(${Target} PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(${Target} PRIVATE curt)
target_compile_options(${Target} PRIVATE ${CXX_FLAGS} -Wno-attributes -Wno-c++11-narrowing -Wdouble-promotion)
install(FILES ${header_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/bw_cuda_kernel)
install(TARGETS ${Target} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
#读取版本号:
#这个函数的作用是从一个头文件中读取并提取出bw_cuda_kernel库的版本号,并将其存储到CMake变量中。具体来说,函数首先读取${CMAKE_CURRENT_LIST_DIR}/include/bw_cuda_kernel/version.h文件的内容,然后使用正则表达式匹配该文件中的版本号信息。如果匹配失败,则会输出错误信息并终止CMake的配置过程。如果匹配成功,则将版本号的各个部分(major、minor、patch)分别存储到对应的CMake变量中,并使用PARENT_SCOPE选项将变量的作用域提升到全局。最后,函数还将完整的版本号(major.minor.patch)存储到BW_CUDA_KERNEL_VERSION变量中,以便在其他地方使用。
include(cmake/utils.cmake)
include(cmake/ide.cmake)
if (NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
set(CMAKE_INSTALL_INCLUDEDIR include)
endif()
if (NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR lib)
endif()
bw_cuda_kernel_extract_version()
target_compile_definitions(bw_cuda_kernel PUBLIC BW_CUDA_KERNEL_COMPILED_LIB)
target_include_directories(bw_cuda_kernel PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
message(STATUS "BW_CUDA_KERNEL_VERSION_MAJOR: " ${BW_CUDA_KERNEL_VERSION} ${BW_CUDA_KERNEL_VERSION_MAJOR})
set_target_properties(bw_cuda_kernel PROPERTIES VERSION ${BW_CUDA_KERNEL_VERSION} SOVERSION ${BW_CUDA_KERNEL_VERSION_MAJOR}.${BW_CUDA_KERNEL_VERSION_MINOR})
add_library(bw_cuda_kernel_header_only INTERFACE)
# add_library(bw_cuda_kernel_header_only ALIAS bw_cuda_kernel_header_only)
target_include_directories(bw_cuda_kernel_header_only INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
message(STATUS "Generating install")
set(project_config_in "${CMAKE_CURRENT_LIST_DIR}/cmake/BwCudaKernelConfig.cmake.in")
set(project_config_out "${CMAKE_CURRENT_BINARY_DIR}/BwCudaKernelConfig.cmake")
set(config_targets_file "BwCudaKernelConfigTargets.cmake")
set(version_config_file_in "${CMAKE_CURRENT_LIST_DIR}/cmake/BwCudaKernelConfigVersion.cmake")
set(version_config_file "${CMAKE_CURRENT_BINARY_DIR}/BwCudaKernelConfigVersion.cmake")
# set(version_config_file "${CMAKE_CURRENT_LIST_DIR}/cmake/BwCudaKernelConfigVersion.cmake")
set(export_dest_dir "${CMAKE_INSTALL_LIBDIR}/cmake/BwCudaKernel")
set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
set(pkg_config "${CMAKE_BINARY_DIR}/BwCudaKernel.pc")
# ---------------------------------------------------------------------------------------
# Include files
# ---------------------------------------------------------------------------------------
install(DIRECTORY include/ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(
TARGETS bw_cuda_kernel bw_cuda_kernel_header_only
EXPORT bw_cuda_kernel
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
# ---------------------------------------------------------------------------------------
# Install pkg-config file
# ---------------------------------------------------------------------------------------
if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
set(PKG_CONFIG_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}")
else()
set(PKG_CONFIG_INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
endif()
if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
set(PKG_CONFIG_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
else()
set(PKG_CONFIG_LIBDIR "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
endif()
get_target_property(PKG_CONFIG_DEFINES bw_cuda_kernel INTERFACE_COMPILE_DEFINITIONS)
string(REPLACE ";" " -D" PKG_CONFIG_DEFINES "${PKG_CONFIG_DEFINES}")
string(CONCAT PKG_CONFIG_DEFINES "-D" "${PKG_CONFIG_DEFINES}")
configure_file("cmake/BwCudaKernel.pc.in" "${pkg_config}" @ONLY)
install(FILES "${pkg_config}" DESTINATION "${pkgconfig_install_dir}")
# ---------------------------------------------------------------------------------------
# Install CMake config files
# ---------------------------------------------------------------------------------------
export(
TARGETS bw_cuda_kernel
NAMESPACE bw::
FILE "${CMAKE_CURRENT_BINARY_DIR}/${config_targets_file}")
install(EXPORT bw_cuda_kernel DESTINATION ${export_dest_dir} NAMESPACE bw:: FILE ${config_targets_file})
include(CMakePackageConfigHelpers)
configure_package_config_file("${project_config_in}" "${project_config_out}"
INSTALL_DESTINATION ${export_dest_dir})
configure_package_config_file("${version_config_file_in}" "${version_config_file}"
INSTALL_DESTINATION ${export_dest_dir})
message(STATUS "version_config_file: ${version_config_file}")
# write_basic_package_version_file("${version_config_file}" COMPATIBILITY SameMajorVersion)
install(FILES "${project_config_out}" "${version_config_file}" DESTINATION "${export_dest_dir}")
# # ---------------------------------------------------------------------------------------
# # Support creation of installable packages
# # ---------------------------------------------------------------------------------------
include(cmake/BwCudaKernelCPack.cmake)