【目录结构】将源文件按g++及dlcc编译器分开编译

67 篇文章 1 订阅
2 篇文章 0 订阅


在登临中.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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值