Lite3DReg / CMakeLists.txt
duanbotu123
Initial commit: add index.html
f6dd1c2
cmake_minimum_required(VERSION 3.16)
project(Lightweight3DRegLib)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# 第三方库路径
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# --- 第三方库
find_package(Eigen3 3.4.0 REQUIRED)
message(STATUS "Found Eigen3 version: ${EIGEN3_VERSION_STRING}")
find_package(OpenMesh REQUIRED)
find_package(OpenMP REQUIRED)
# --- 添加 pybind11 支持 ---
find_package(pybind11 CONFIG REQUIRED)
option(USEPARDISO "Use Pardiso solver" ON)
# --- 源文件
file(GLOB_RECURSE SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/core/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/io/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/geodesic/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/preprocess/*.cpp"
)
file(GLOB_RECURSE HEADERS
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/core/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/io/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/geodesic/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/preprocess/*.h"
"${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/*.h"
)
# --- 创建静态库
add_library(Lightweight3DRegLib STATIC ${SOURCES} ${HEADERS})
target_precompile_headers(Lightweight3DRegLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/cpp/pch.h")
set_target_properties(Lightweight3DRegLib PROPERTIES POSITION_INDEPENDENT_CODE ON)
# --- include 路径
target_include_directories(Lightweight3DRegLib
PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/core"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/io"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/geodesic"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/preprocess"
"${CMAKE_CURRENT_SOURCE_DIR}/3rdparty"
${EIGEN3_INCLUDE_DIRS}
)
# --- 链接库
target_link_libraries(Lightweight3DRegLib
PUBLIC OpenMeshCore OpenMeshTools
PUBLIC OpenMP::OpenMP_CXX
)
# --- Pardiso / MKL
if(USEPARDISO AND ${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
if(EXISTS /opt/intel/oneapi/mkl/latest/include/mkl_pardiso.h)
target_compile_definitions(Lightweight3DRegLib PUBLIC USE_PARDISO)
target_include_directories(Lightweight3DRegLib SYSTEM PUBLIC "/opt/intel/oneapi/mkl/latest/include")
target_compile_options(Lightweight3DRegLib PUBLIC "-m64")
target_link_libraries(Lightweight3DRegLib PRIVATE
"-Wl,--start-group /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.a"
"/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_gnu_thread.a"
"/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.a"
"-Wl,--end-group -lgomp -lpthread -lm -ldl"
)
else()
message("Cannot find Intel MKL at /opt/intel/oneapi/mkl. Using Eigen LDLT.")
endif()
endif()
# --- 添加 Python 模块 ---
pybind11_add_module(pyregister ${CMAKE_CURRENT_SOURCE_DIR}/python/pyregister.cpp)
target_link_libraries(pyregister
PRIVATE
Lightweight3DRegLib
OpenMeshCore
OpenMeshTools
OpenMP::OpenMP_CXX
)
target_include_directories(pyregister
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/core"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/io"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/geodesic"
"${CMAKE_CURRENT_SOURCE_DIR}/cpp/tools/preprocess"
"${CMAKE_CURRENT_SOURCE_DIR}/3rdparty"
${EIGEN3_INCLUDE_DIRS}
)
target_precompile_headers(pyregister REUSE_FROM Lightweight3DRegLib)
if(USEPARDISO AND ${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
if(EXISTS /opt/intel/oneapi/mkl/latest/include/mkl_pardiso.h)
target_compile_definitions(pyregister PRIVATE USE_PARDISO)
target_include_directories(pyregister SYSTEM PRIVATE "/opt/intel/oneapi/mkl/latest/include")
target_compile_options(pyregister PRIVATE "-m64")
target_link_libraries(pyregister PRIVATE
"-Wl,--start-group /opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_intel_lp64.a"
"/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_gnu_thread.a"
"/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.a"
"-Wl,--end-group -lgomp -lpthread -lm -ldl"
)
endif()
endif()
set_target_properties(pyregister PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/python
)
# =====================================================================
# --- 添加示例可执行程序 (examples/c++/main.cpp) ---
# =====================================================================
file(GLOB EXAMPLE_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/examples/c++/*.cpp"
)
add_executable(Lightweight3DRegDemo ${EXAMPLE_SOURCES})
target_precompile_headers(Lightweight3DRegDemo PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/cpp/pch.h")
target_link_libraries(Lightweight3DRegDemo
PRIVATE
Lightweight3DRegLib
OpenMeshCore
OpenMeshTools
OpenMP::OpenMP_CXX
)
set_target_properties(Lightweight3DRegDemo PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/examples
)