DWG复现环境

2025年6月8日 下午5:55 科研 ,

DWG复现环境

基于 CUDA 的点云重建与法线估计工具。
🔗项目链接:https://dwgtech.github.io/
使用git clone进行,而非zip形式

1. 🚀环境准备

  1. 创建 Conda 环境

    mamba create -n dwg_env -c conda-forge \
     cmake=3.27 gcc_linux-64=9 gxx_linux-64=9 \
     boost=1.84 pcl=1.14 cgal=5.2 -y
  2. 激活环境

    conda activate dwg_env
  3. 设置环境变量

    export CUDA_HOME=/usr/local/cuda
    export PATH=$CUDA_HOME/bin:$CONDA_PREFIX/bin:$PATH
    export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$CONDA_PREFIX/lib:$LD_LIBRARY_PATH

(未使用 activate.d 方式;每次手动执行 export)

2. 📋编译项目

  1. 创建并进入 build 目录

    mkdir -p build && cd build
  2. 生成 Makefile

    cmake .. -DCMAKE_BUILD_TYPE=Release
  3. 并行编译

    make -j$(nproc)

3. 🏃‍♂️运行示例

./bin/DWG_CUDA \
  --in_path   /绝对/点云/路径 \
  --in_name   文件名.xyz \
  --out_path  /绝对/输出/路径

例如:

./bin/DWG_CUDA --in_path ./../data --in_name camel_normals.xyz --out_path ./../output/ --com_As 1 --in_normal 1 --lambda 10 --kw 7 --grid_reso 200 --use_radii 1

4. ⚙️参数说明

参数 含义 默认/选项
--in_path 输入点云文件所在目录绝对路径
--in_name 输入点云文件名(仅支持 .xyz
--out_path 输出结果保存目录绝对路径
--output_mode 输出模式:1 Mesh(.stl)
2 带法线点云(.xyz)
3 两者均输出
1
--in_normal 法线初始化模式:0 随机
1 输入法线
3 高斯图(Gauss map)
3
--lambda 屏蔽系数,细窄增大
--max_depth 八叉树最大深度
--use_radii 是否开启屏蔽模式:0 关
1 开
--kw 迭代时最近邻数 10
--final_kw 最终输出时最近邻数 10
--grid_reso 迭代时 Marching Cubes 分辨率
--final_reso 最终输出时 Marching Cubes 分辨率
--total_iter 最大迭代次数
--test_iter 中间结果输出频率(关闭则填 0) 0
--com_As 是否计算面积权重:0 关
1 开
--use_leaves_generate 噪声较高时开启:0 关
1 开

⚠️注意:
运行时需要带参数,很多参数没有默认值,请见上面的【运行示例】

5. 🔧常见问题

  1. 找不到 PCL 库

    • 错误示例:error while loading shared libraries: libpcl_features.so.1.14 ...
    • 解决:检查并执行 export LD_LIBRARY_PATH=...,重新激活环境。
  2. Boost 版本冲突

    • 错误示例:Could not find boost_filesystem 1.71.0
    • 解决:使用 Conda 安装 boost=1.84,并在 CMake 中禁用系统 Boost。
  3. 找不到 PCLConfig.cmake

    • 错误示例:Could not find a package configuration file provided by "PCL"
    • 解决:确保 CMAKE_PREFIX_PATH 包含 $CONDA_PREFIX,并通过 Conda 安装 PCL。
  4. CGAL 头文件缺失

    • 错误示例:fatal error: CGAL/Exact_predicates_exact_constructions_kernel.h: No such file
    • 解决:安装 cgal>=5.2
  5. CUDA 编译器未找到

    • 错误示例:Couldn't find CUDA library root
    • 解决:执行 export CUDA_HOME=/usr/local/cuda,并更新 PATHLD_LIBRARY_PATH
  6. nvcc 不可用

    • 错误示例:Command 'nvcc' not found
    • 解决:export PATH=$CUDA_HOME/bin:$PATH
  7. 链接错误

    • 错误示例:undefined reference to std::condition_variable ...
    • 解决:使用 Conda 安装 gcc_linux-64=9 gxx_linux-64=9,并优先使用 Conda 编译器。

下次使用

conda activate dwg_env
cd /项目/路径/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

CMakeLists.txt

cmake_minimum_required(VERSION 3.18 FATAL_ERROR)        # 要求 CMake 最低版本 3.18,否则终止配置

# Suppress policy warnings
if(POLICY CMP0167)                                     # 如果启用了 CMP0167 策略
  cmake_policy(SET CMP0167 NEW)                        # 则将其设置为新的行为
endif()                                                # 结束判断
if(POLICY CMP0104)                                     # 如果启用了 CMP0104 策略
  cmake_policy(SET CMP0104 NEW)                        # 则将其设置为新的行为
endif()                                                # 结束判断

# Find CUDA compiler before project declaration
if(NOT DEFINED CMAKE_CUDA_COMPILER OR CMAKE_CUDA_COMPILER STREQUAL "")  # 如果未指定 CUDA 编译器
  find_program(CMAKE_CUDA_COMPILER nvcc                  # 在常见路径中查找 nvcc
    HINTS /usr/local/cuda/bin /usr/bin $ENV{PATH}
  )
  message(STATUS "Using CUDA compiler: ${CMAKE_CUDA_COMPILER}")  # 打印所使用的 nvcc 路径
endif()

# ---- Force CMake to prefer packages inside current conda env --------------
if(DEFINED ENV{CONDA_PREFIX})                           # 如果存在 CONDA_PREFIX 环境变量
    list(PREPEND CMAKE_PREFIX_PATH $ENV{CONDA_PREFIX})  # 将 Conda 环境路径添加到 CMAKE_PREFIX_PATH
endif()
# Tell FindBoost NOT to use any BoostConfig.cmake on the system
set(Boost_NO_SYSTEM_PATHS ON)                           # 禁止系统路径中的 BoostConfig.cmake
set(Boost_NO_BOOST_CMAKE ON)    # <- this forces "module mode" only  # 强制使用模块模式查找 Boost
# ---------------------------------------------------------------------------

project(DWG_CUDA LANGUAGES CXX CUDA)                    # 定义项目名及使用的语言:C++ 和 CUDA

# --- BEGIN conda-libstdc++ rpath hack --------------------------------------
if(DEFINED ENV{CONDA_PREFIX})                           # 如果在 Conda 环境中
  list(APPEND CMAKE_PREFIX_PATH $ENV{CONDA_PREFIX})     # 再次确保 Conda 路径在前缀路径中
  set(CMAKE_LIBRARY_PATH "$ENV{CONDA_PREFIX}/lib" ${CMAKE_LIBRARY_PATH})  # 添加 Conda 库路径
  set(CMAKE_EXE_LINKER_FLAGS                                  
      "${CMAKE_EXE_LINKER_FLAGS} -L$ENV{CONDA_PREFIX}/lib"  # 将 Conda 库路径加入链接器搜索路径
  )
  set(CMAKE_SKIP_BUILD_RPATH FALSE)                      # 不跳过构建时的 rpath
  set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)               # 构建使用安装时的 rpath
  set(CMAKE_BUILD_RPATH "$ENV{CONDA_PREFIX}/lib")        # 设置构建时的 rpath
  set(CMAKE_INSTALL_RPATH "$ENV{CONDA_PREFIX}/lib")      # 设置安装时的 rpath
endif()                                                 # 结束 Conda rpath hack
# --- END conda-libstdc++ rpath hack ----------------------------------------

# Prevent in-source builds
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)         # 如果源目录等于二进制目录
  message(FATAL_ERROR "Please build in a separate build directory.")  # 提示在单独目录构建
endif()                                                # 结束判断

# If using Conda, hint CMake to search under CONDA_PREFIX
if(DEFINED ENV{CONDA_PREFIX})                          # 再次检查 Conda 环境
  list(APPEND CMAKE_PREFIX_PATH "$ENV{CONDA_PREFIX}")   # 添加 Conda 前缀到 CMAKE_PREFIX_PATH
  set(CMAKE_LIBRARY_PATH "$ENV{CONDA_PREFIX}/lib" ${CMAKE_LIBRARY_PATH})  # 添加库搜索路径
  set(CMAKE_INCLUDE_PATH "$ENV{CONDA_PREFIX}/include" ${CMAKE_INCLUDE_PATH})  # 添加头文件搜索路径
endif()                                                # 结束判断

# Turn off verbose makefiles unless explicitly requested
set(CMAKE_VERBOSE_MAKEFILE OFF)                        # 关闭冗长的 Makefile 输出

# Language standards
set(CMAKE_CXX_STANDARD 17)                             # 设置 C++ 标准为 C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON)                    # 强制要求 C++17
set(CMAKE_CUDA_STANDARD 14)                            # 设置 CUDA 标准为 CUDA14
set(CMAKE_CUDA_STANDARD_REQUIRED ON)                   # 强制要求 CUDA14

# CUDA architectures (semicolon-separated list)
option(CUDA_ARCH "CUDA architectures (e.g. \"75;80\")" "")  # 可选手动指定 CUDA 架构
if(CUDA_ARCH)                                          # 如果用户指定了架构
  set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH} CACHE STRING "" FORCE)  # 应用指定架构
else()                                                  # 否则
  set(CMAKE_CUDA_ARCHITECTURES OFF CACHE STRING "" FORCE)  # 禁用自动架构
endif()                                                 # 结束判断

# Output directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")    # 静态库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")    # 动态库输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")    # 可执行文件输出目录

# Export compile commands
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)                   # 导出编译命令到 compile_commands.json

# Compiler warnings and flags for C++
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")           # 如果使用 GCC 或 Clang
  add_compile_options(                                  # 添加通用警告选项
    -Wall -Wextra -g3
    -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-deprecated-declarations
    -Wno-sign-compare -Wno-comment -Wno-maybe-uninitialized
  )
  set(CMAKE_CXX_FLAGS_RELEASE "-march=native -O3 -DNDEBUG")  # Release 模式优化选项
endif()

# Dependencies
find_package(OpenMP REQUIRED)                          # 查找 OpenMP
find_package(Boost REQUIRED COMPONENTS filesystem iostreams system)  # 查找 Boost 文件系统、IOStreams、System
find_package(PCL REQUIRED COMPONENTS common io kdtree search features)  # 查找 PCL 模块
find_package(CGAL QUIET COMPONENTS Core)                # 查找 CGAL Core,可选
find_package(CUDAToolkit REQUIRED)                      # 查找 CUDA 工具包

# Sources
file(GLOB_RECURSE DWG_SOURCES                           # 搜集所有源文件
  "${CMAKE_SOURCE_DIR}/src/*.cpp"
  "${CMAKE_SOURCE_DIR}/src/*.cu"
)

# Executable target
add_executable(${PROJECT_NAME} ${DWG_SOURCES})          # 定义可执行目标及其源文件

# Include directories
#  - own project includes as non-system
target_include_directories(${PROJECT_NAME} PUBLIC        # 添加项目自身头文件目录
  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
)

#  - third-party includes as SYSTEM to suppress their warnings
#    (for C++ host code)
target_include_directories(${PROJECT_NAME} SYSTEM PUBLIC  # 添加第三方库头文件目录
  ${Boost_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  $<TARGET_PROPERTY:CUDA::cudart,INTERFACE_INCLUDE_DIRECTORIES>
  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/cudaKDTree>
  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/geometrycentral>
  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/deps/libigl/include>
)

# CUDA-specific compile options (nvcc flags)
target_compile_options(${PROJECT_NAME} PRIVATE            # 添加 CUDA 编译选项
  $<$<COMPILE_LANGUAGE:CUDA>:-O3>
  $<$<COMPILE_LANGUAGE:CUDA>:--use_fast_math>
  # pass host warnings flags through nvcc
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wall>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wextra>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-parameter>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-variable>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-unused-function>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-deprecated-declarations>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-sign-compare>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-comment>
  $<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-Wno-maybe-uninitialized>
)

# Link libraries
target_link_libraries(${PROJECT_NAME} PUBLIC              # 链接所需库
  OpenMP::OpenMP_CXX
  ${PCL_LIBRARIES}
  Boost::filesystem
  Boost::iostreams
  Boost::system
  CUDA::cudart
  $<$<TARGET_EXISTS:CGAL::CGAL>:CGAL::CGAL>
)

# Enable CUDA separable compilation
set_target_properties(${PROJECT_NAME} PROPERTIES         # 启用 CUDA 可分离编译与安装时 rpath
  CUDA_SEPARABLE_COMPILATION ON
  BUILD_WITH_INSTALL_RPATH TRUE
  INSTALL_RPATH "$ORIGIN/../lib"
)

message(STATUS "CMake configuration complete.")          # 打印配置完成信息

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

  • 分类

  • 归档

  • 页面