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 )